Using C# to check if string contains a string in string array

C#ArraysStringSearch

C# Problem Overview


I want to use C# to check if a string value contains a word in a string array. For example,

string stringToCheck = "text1text2text3";

string[] stringArray = { "text1", "someothertext", etc... };

if(stringToCheck.contains stringArray) //one of the items?
{

}

How can I check if the string value for 'stringToCheck' contains a word in the array?

C# Solutions


Solution 1 - C#

Here's how:

using System.Linq;

if(stringArray.Any(stringToCheck.Contains))

/* or a bit longer: (stringArray.Any(s => stringToCheck.Contains(s))) */

This checks if stringToCheck contains any one of substrings from stringArray. If you want to ensure that it contains all the substrings, change Any to All:

if(stringArray.All(stringToCheck.Contains))

Solution 2 - C#

Here is how you can do it:

string stringToCheck = "text1";
string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
foreach (string x in stringArray)
{
    if (stringToCheck.Contains(x))
    {
        // Process...
    }
}

Maybe you are looking for a better solution... Refer to Anton Gogolev's answer which makes use of LINQ.

Solution 3 - C#

⚠️ Note: this does not answer the question asked
The question asked is "how can I check if a sentence contains any word from a list of words?"
This answer checks if a list of words contains one particular word

Try this:

No need to use LINQ

if (Array.IndexOf(array, Value) >= 0)
{
    //Your stuff goes here
}

Solution 4 - C#

⚠️ Note: this does not answer the question asked
The question asked is "how can I check if a sentence contains any word from a list of words?"
This answer checks if a list of words contains one particular word

Just use the LINQ method:

stringArray.Contains(stringToCheck)

Solution 5 - C#

⚠️ Note: this does not answer the question asked
The question asked is "how can I check if a sentence contains any word from a list of words?"
This answer checks if a list of words contains one particular word

The easiest and simplest way:

bool bol = Array.Exists(stringarray, E => E == stringtocheck);

Solution 6 - C#

⚠️ Note: this does not answer the question asked
The question asked is "how can I check if a sentence contains any word from a list of words?"
This answer checks if a list of words contains one particular word
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };

if (strNamesArray.Any(x => x == strName))
{
   // do some action here if true...
}

Solution 7 - C#

Something like this perhaps:

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
if (Array.Exists<string>(stringArray, (Predicate<string>)delegate(string s) { 
	return stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1; })) {
	Console.WriteLine("Found!");
}

Solution 8 - C#

⚠️ Note: this does not answer the question asked
The question asked is "how can I check if a sentence contains any word from a list of words?"
This answer checks if a list of words contains one particular word
  stringArray.ToList().Contains(stringToCheck)

Solution 9 - C#

Using LINQ and a method group would be the quickest and more compact way of doing this.

var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};

if (arrayB.Any(arrayA.Contains)) 
    return true;

Solution 10 - C#

You can define your own string.ContainsAny() and string.ContainsAll() methods. As a bonus, I've even thrown in a string.Contains() method that allows for case-insensitive comparison, etc.

public static class Extensions
{
	public static bool Contains(this string source, string value, StringComparison comp)
	{
		return source.IndexOf(value, comp) > -1;
	}

	public static bool ContainsAny(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
	{
		return values.Any(value => source.Contains(value, comp));
	}

	public static bool ContainsAll(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
	{
		return values.All(value => source.Contains(value, comp));
	}
}

You can test these with the following code:

	public static void TestExtensions()
	{
		string[] searchTerms = { "FOO", "BAR" };
		string[] documents = {
			"Hello foo bar",
			"Hello foo",
			"Hello"
		};

		foreach (var document in documents)
		{
			Console.WriteLine("Testing: {0}", document);
			Console.WriteLine("ContainsAny: {0}", document.ContainsAny(searchTerms, StringComparison.OrdinalIgnoreCase));
			Console.WriteLine("ContainsAll: {0}", document.ContainsAll(searchTerms, StringComparison.OrdinalIgnoreCase));
			Console.WriteLine();
		}
	}

Solution 11 - C#

If stringArray contains a large number of varied length strings, consider using a Trie to store and search the string array.

public static class Extensions
{
    public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
    {
        Trie trie = new Trie(stringArray);
        for (int i = 0; i < stringToCheck.Length; ++i)
        {
            if (trie.MatchesPrefix(stringToCheck.Substring(i)))
            {
                return true;
            }
        }

        return false;
    }
}

Here is the implementation of the Trie class

public class Trie
{
    public Trie(IEnumerable<string> words)
    {
        Root = new Node { Letter = '\0' };
        foreach (string word in words)
        {
            this.Insert(word);
        }
    }

    public bool MatchesPrefix(string sentence)
    {
        if (sentence == null)
        {
            return false;
        }

        Node current = Root;
        foreach (char letter in sentence)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
                if (current.IsWord)
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }

        return false;
    }

    private void Insert(string word)
    {
        if (word == null)
        {
            throw new ArgumentNullException();
        }

        Node current = Root;
        foreach (char letter in word)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
            }
            else
            {
                Node newNode = new Node { Letter = letter };
                current.Links.Add(letter, newNode);
                current = newNode;
            }
        }

        current.IsWord = true;
    }

    private class Node
    {
        public char Letter;
        public SortedList<char, Node> Links = new SortedList<char, Node>();
        public bool IsWord;
    }

    private Node Root;
}

If all strings in stringArray have the same length, you will be better off just using a HashSet instead of a Trie

public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
    int stringLength = stringArray.First().Length;
    HashSet<string> stringSet = new HashSet<string>(stringArray);
    for (int i = 0; i < stringToCheck.Length - stringLength; ++i)
    {
        if (stringSet.Contains(stringToCheck.Substring(i, stringLength)))
        {
            return true;
        }
    }

    return false;
}

Solution 12 - C#

You can also do the same thing as Anton Gogolev suggests to check if any item in stringArray1 matches any item in stringArray2:

using System.Linq;
if(stringArray1.Any(stringArray2.Contains))

And likewise all items in stringArray1 match all items in stringArray2:

using System.Linq;
if(stringArray1.All(stringArray2.Contains))

Solution 13 - C#

I used a similar method to the IndexOf by Maitrey684 and the foreach loop of Theomax to create this. (Note: the first 3 "string" lines are just an example of how you could create an array and get it into the proper format).

If you want to compare 2 arrays, they will be semi-colon delimited, but the last value won't have one after it. If you append a semi-colon to the string form of the array (i.e. a;b;c becomes a;b;c;), you can match using "x;" no matter what position it is in:

bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";

foreach (string s in otherArray)
{
    if (myStringArray.IndexOf(s + ";") != -1) {
       found = true;
       break;
    }
}

if (found == true) { 
    // ....
}

Solution 14 - C#

⚠️ Note: this does not answer the question asked
The question asked is "how can I check if a sentence contains any word from a list of words?"
This answer checks if a list of words contains one particular word

I use the following in a console application to check for arguments

var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");

Solution 15 - C#

⚠️ Note: this does not answer the question asked
The question asked is "how can I check if a sentence contains any word from a list of words?"
This answer checks if a list of words contains one particular word

I would use LINQ, but it still can be done through:

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);

Solution 16 - C#

To complete the previous answers, for the IgnoreCase check, use:

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)

Solution 17 - C#

For my case, the above answers did not work. I was checking for a string in an array and assigning it to a boolean value. I modified Anton Gogolev's answer and removed the Any() method and put the stringToCheck inside the Contains() method.

bool isContain = stringArray.Contains(stringToCheck);

Solution 18 - C#

Using Find or FindIndex methods of the Array class:

if(Array.Find(stringArray, stringToCheck.Contains) != null) 
{ 
}
if(Array.FindIndex(stringArray, stringToCheck.Contains) != -1) 
{ 
}

Solution 19 - C#

Most of those solutions are correct, but if you need to check values without case sensitivity:

using System.Linq;
...
string stringToCheck = "text1text2text3";
string[] stringArray = { "text1", "someothertext"};

if(stringArray.Any(a=> String.Equals(a, stringToCheck, StringComparison.InvariantCultureIgnoreCase)) )
{
   //contains
}

if (stringArray.Any(w=> w.IndexOf(stringToCheck, StringComparison.InvariantCultureIgnoreCase)>=0))
{
   //contains
}

dotNetFiddle example

Solution 20 - C#

You can try this solution as well.

string[] nonSupportedExt = { ".3gp", ".avi", ".opus", ".wma", ".wav", ".m4a", ".ac3", ".aac", ".aiff" };
		
bool valid = Array.Exists(nonSupportedExt,E => E == ".Aac".ToLower());

Solution 21 - C#

Try:

String[] val = { "helloword1", "orange", "grape", "pear" };
String sep = "";
string stringToCheck = "word1";

bool match = String.Join(sep,val).Contains(stringToCheck);
bool anothermatch = val.Any(s => s.Contains(stringToCheck));

Solution 22 - C#

string [] lines = {"text1", "text2", "etc"};

bool bFound = lines.Any(x => x == "Your string to be searched");

bFound is set to true if the searched string is matched with any element of array 'lines'.

Solution 23 - C#

LINQ:

arrray.Any(x => word.Equals(x));

This is to see if array contains the word (exact match). Use .Contains for the substring, or whatever other logic you may need to apply instead.

Solution 24 - C#

Try this. Example: To check if the field contains any of the words in the array. To check if the field (someField) contains any of the words in the array.

String[] val = { "helloword1", "orange", "grape", "pear" };

Expression<Func<Item, bool>> someFieldFilter = i => true;

someFieldFilter = i => val.Any(s => i.someField.Contains(s));

Solution 25 - C#

public bool ContainAnyOf(string word, string[] array) 
    {
        for (int i = 0; i < array.Length; i++)
        {
            if (word.Contains(array[i]))
            {
                return true;
            }
        }
        return false;
    }

Solution 26 - C#

Try this

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };

var t = lines.ToList().Find(c => c.Contains(stringToCheck));

It will return you the line with the first incidence of the text that you are looking for.

Solution 27 - C#

A simple solution that does not require any LINQ:

String.Join(",", array).Contains(Value + ",");

Solution 28 - C#

int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);

Solution 29 - C#

Try this. There isn't any need for a loop..

string stringToCheck = "text1";
List<string> stringList = new List<string>() { "text1", "someothertext", "etc.." };
if (stringList.Exists(o => stringToCheck.Contains(o)))
{

}

Solution 30 - C#

I used the following code to check if the string contained any of the items in the string array:

foreach (string s in stringArray)
{
    if (s != "")
    {
        if (stringToCheck.Contains(s))
        {
            Text = "matched";
        }
    }
}

Solution 31 - C#

Three options demonstrated. I prefer to find the third as the most concise.

class Program {
	static void Main(string[] args) {
	string req = "PUT";
	if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
		Console.WriteLine("one.1.A");  // IS TRUE
	}
	req = "XPUT";
	if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
		Console.WriteLine("one.1.B"); // IS TRUE
	}
	req = "PUTX";
	if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
		Console.WriteLine("one.1.C");  // IS TRUE
	}
	req = "UT";
	if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
		Console.WriteLine("one.1.D"); // false
	}
	req = "PU";
	if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
		Console.WriteLine("one.1.E"); // false
	}
	req = "POST";
	if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
		Console.WriteLine("two.1.A"); // IS TRUE
	}
	req = "ASD";
	if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
		Console.WriteLine("three.1.A");  // false
	}


	Console.WriteLine("-----");
	req = "PUT";
	if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
		Console.WriteLine("one.2.A"); // IS TRUE
	}
	req = "XPUT";
	if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
		Console.WriteLine("one.2.B"); // false
	}
	req = "PUTX";
	if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
		Console.WriteLine("one.2.C"); // false
	}
	req = "UT";
	if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
		Console.WriteLine("one.2.D"); // false
	}
	req = "PU";
	if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
		Console.WriteLine("one.2.E"); // false
	}
	req = "POST";
	if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
		Console.WriteLine("two.2.A");  // IS TRUE
	}
	req = "ASD";
	if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
		Console.WriteLine("three.2.A");  // false
	}

	Console.WriteLine("-----");
	req = "PUT";
	if ((new string[] {"PUT", "POST"}.Contains(req)))  {
		Console.WriteLine("one.3.A"); // IS TRUE
	}
	req = "XPUT";
	if ((new string[] {"PUT", "POST"}.Contains(req)))  {
		Console.WriteLine("one.3.B");  // false
	}
	req = "PUTX";
	if ((new string[] {"PUT", "POST"}.Contains(req)))  {
		Console.WriteLine("one.3.C");  // false
	}
	req = "UT";
	if ((new string[] {"PUT", "POST"}.Contains(req)))  {
		Console.WriteLine("one.3.D");  // false
	}
	req = "PU";
	if ((new string[] {"PUT", "POST"}.Contains(req)))  {
		Console.WriteLine("one.3.E");  // false
	}
	req = "POST";
	if ((new string[] {"PUT", "POST"}.Contains(req)))  {
		Console.WriteLine("two.3.A");  // IS TRUE
	}
	req = "ASD";
	if ((new string[] {"PUT", "POST"}.Contains(req)))  {
		Console.WriteLine("three.3.A");  // false
	}

	Console.ReadKey();
	}
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTheomaxView Question on Stackoverflow
Solution 1 - C#Anton GogolevView Answer on Stackoverflow
Solution 2 - C#Abdel Raoof OlakaraView Answer on Stackoverflow
Solution 3 - C#Maitrey684View Answer on Stackoverflow
Solution 4 - C#Legolas21View Answer on Stackoverflow
Solution 5 - C#lwinView Answer on Stackoverflow
Solution 6 - C#Vernie NamcaView Answer on Stackoverflow
Solution 7 - C#Fredrik JohanssonView Answer on Stackoverflow
Solution 8 - C#Christer CarlssonView Answer on Stackoverflow
Solution 9 - C#Jun ZhengView Answer on Stackoverflow
Solution 10 - C#Kyle DelaneyView Answer on Stackoverflow
Solution 11 - C#tcbView Answer on Stackoverflow
Solution 12 - C#Scotty.NETView Answer on Stackoverflow
Solution 13 - C#vapcguyView Answer on Stackoverflow
Solution 14 - C#bartburkhardtView Answer on Stackoverflow
Solution 15 - C#CloudyMarbleView Answer on Stackoverflow
Solution 16 - C#Shadi SerhanView Answer on Stackoverflow
Solution 17 - C#Matthew MirandaView Answer on Stackoverflow
Solution 18 - C#Andriy TolstoyView Answer on Stackoverflow
Solution 19 - C#mr RView Answer on Stackoverflow
Solution 20 - C#Muhammad Shoaib KaramatView Answer on Stackoverflow
Solution 21 - C#ValkoView Answer on Stackoverflow
Solution 22 - C#Pabitra DashView Answer on Stackoverflow
Solution 23 - C#3xCh1_23View Answer on Stackoverflow
Solution 24 - C#VijayView Answer on Stackoverflow
Solution 25 - C#nakisaView Answer on Stackoverflow
Solution 26 - C#Fernando ChávezView Answer on Stackoverflow
Solution 27 - C#user5789849View Answer on Stackoverflow
Solution 28 - C#amit jhaView Answer on Stackoverflow
Solution 29 - C#Amjad Abu SaaView Answer on Stackoverflow
Solution 30 - C#TheomaxView Answer on Stackoverflow
Solution 31 - C#SteveView Answer on Stackoverflow