388

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" };

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

}

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

2
  • 2
    This blog benchmarks numerous techniques for testing if a string contains a string: blogs.davelozinski.com/curiousconsultant/… Commented Oct 2, 2013 at 0:45
  • This is a prime candidate for a meta question about highly upvoted incorrect answers. Is there already one? Commented Apr 21, 2022 at 22:26

33 Answers 33

1002

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))
Sign up to request clarification or add additional context in comments.

11 Comments

@Spooks Linq To Objects (which is used in the answer's string-check) can be used via LinqBridge on .NET 2.0 albahari.com/nutshell/linqbridge.aspx
how would you do this with case invariance?
@Offler That would be stringArray.Any(s => s.IndexOf(stringToCheck, StringComparison.CurrentCultureIgnoreCase) > -1)
My edits to this post are always rejected but just to add that you can also use the same syntax of Any() on All(), i.e. if(stringArray.All(stringToCheck.Contains)).
Handles comparison badly if one of the strings is empty. So not recommended.
|
185

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.

11 Comments

Thanks, I modified your code to: if (stringToCheck.Contains(s)) and it worked.
I did if (stringArray.Contains(stringToCheck)) and it works great, thanks.
Don't use this answer use LINQ instead
Little note to people who do not see Contains method on the string array: Check if you have a "using System.Linq;" namespace in your codefile :)
Linq isn't always available in legacy software.
|
54
⚠️ 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
}

4 Comments

Nice! And what benefit could Linq possibly have over Array.IndexOf??
This doesn't solve the question at all. IndexOf tells you if an array contains an exact match for a string, the original question is if a string contains one of an array of strings, which Linq handles easily.
I know this comment is late, but just to those who don't know, a string is an array of characters so string types do contain an IndexOf method... so @NetMage it is a possible solution.
@Blacky Wolf, Did you read the question? Array.IndexOf tells you if an array contains a value, the OP wanted to know if a value contains any member of an array, exactly the opposite of this answer. You could use String.IndexOf with Linq: stringArray.Any(w => stringToCheck.IndexOf(w) >= 0) but the Linq answer using String.Contains makes more sense, as that is exactly what is being asked for.
51
⚠️ 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)

5 Comments

Note, that Contains is a extension method and you need to do using System.Linq;
This answer is backwards from the question.
How has this answer been upvoted so many times? 5 years after the question is asked and the solution is basically reversed of what the question is asking.
maybe just reverse the variable names it will be ok?
@Jean-FrançoisFabre that will call string.Contains, which is different to array.Contains, and string.Contains does not have an overload that accepts an array of string
9
⚠️ 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);

2 Comments

better is stringarray.Exists(entity => entity == stringtocheck)
I think you cant call exists method directly from string array.Exists method can use directly for list<T>.So should use static method array.exist<T> for string array.check here => msdn.microsoft.com/en-us/library/yw84x8be(v=vs.110).aspx
7
⚠️ 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...
}

1 Comment

I don't think this is what the question is asking for.
4

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!");
}

2 Comments

This is a better solution, since it's a substring check against words in a list instead of an exact match check.
Nice answer, but wow that is hard to read compared to modern C# even without Linq; also, String.Contains might be better than String.IndexOf unless you want to ignore case, since Microsoft forgot a two argument String.Contains you have to write your own. Consider: Array.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
4

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();
        }
    }

Comments

3

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;
}

Comments

3
⚠️ 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)

Comments

3

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;

Comments

2

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

Comments

2

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.

Comments

2
string word = "XRC"; // Try also with word = null; 

string[] myWords = { "CUS", "CT", "NMS", "RX", "RUS", "VUS", "XRC", null };

if (myWords.Contains(word))
    Console.WriteLine("1. if: contains the string");
    
if (myWords.Any(word.Contains))
    Console.WriteLine("2. if: contains the string, but null elements throws an exception");
    
if (myWords.Any(x => x.Equals(word)))
    Console.WriteLine("3. if: contains the string, but null elements throws an exception ");

Comments

1

Using Find or FindIndex methods of the Array class:

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

Comments

1

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());

Comments

1

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))

3 Comments

The second array doesn't have a "Contains" object!
@Mahmut you need to be using System.Linq namespace.
@Scott.Net .. Contains property exist on for string type. It's not exist for an Array type.
1

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);

Comments

1

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) { 
    // ....
}

2 Comments

But Maitrey684 does not answer the question(?).
@PeterMortensen Point was they were on the right track, to use IndexOf, and was simply giving credit to where my idea stemmed from. In other words, you can use the code I supplied to take the array, iterate over it, then do the IndexOf (like Maitrey684 said, sort of) to tell if it contains your value.
1
⚠️ 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);

Comments

1

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

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

1 Comment

Is there any way to get the index of the match with that also? Thanks.
0

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));

1 Comment

Does this even compile? At least the use of "String" and "string" is inconsistent (thus the weird syntax highlighting).
-1
public bool ContainAnyOf(string word, string[] array) 
    {
        for (int i = 0; i < array.Length; i++)
        {
            if (word.Contains(array[i]))
            {
                return true;
            }
        }
        return false;
    }

Comments

-1

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.

Comments

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

Comments

-1
⚠️ 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");

Comments

-1

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));

Comments

-1
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'.

Comments

-1

A simple solution that does not require any LINQ:

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

1 Comment

What if one of the values in the array contains your delimiter?
-1

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)))
{

}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.