Coder Perfect

Check if a string contains a list element (of strings)


For the following code block:

For I = 0 To listOfStrings.Count - 1
    If myString.Contains(lstOfStrings.Item(I)) Then
        Return True
    End If
Return False

The output is:

Case 1:

myString: C:\Files\myfile.doc
listOfString: C:\Files\, C:\Files2\
Result: True

Case 2:

myString: C:\Files3\myfile.doc
listOfString: C:\Files\, C:\Files2\
Result: False

The list (listOfStrings) may have numerous items (at least 20) and must be compared to thousands of strings (like myString).

Is there a more efficient (better) way of writing this code?

Asked by user57175

Solution #1

Using LINQ and C# (I don’t know much about VB these days):

bool b = listOfStrings.Any(s=>myString.Contains(s));

or (more succinct and efficient, but arguably less clear):

bool b = listOfStrings.Any(myString.Contains);

If you’re looking for a way to test equality, HashSet and the like are useful, but they won’t help with partial matches until you separate it into fragments and add an order of complexity.

If you actually mean “StartsWith,” you might sort the list and put it in an array, then use Array.BinarySearch to find each item, checking by lookup to see if it’s a full or partial match.

Answered by Marc Gravell

Solution #2

It should look like this while you’re creating your strings.

bool inact = new string[] { "SUSPENDARE", "DIZOLVARE" }.Any(s=>stare.Contains(s));

Answered by Simi2525

Solution #3

A previous similar query, “Best technique to test for existing string against a huge list of comparables,” yielded a variety of suggestions.

Regex might be enough to meet your needs. All of the possible substrings would be concatenated, with an OR “|” operator between them in the expression. Naturally, you’ll have to keep an eye out for unescaped characters in the expression, as well as failure to compile it due to complexity or size constraints.

Another option is to create a trie data structure that represents all of the potential substrings (this may somewhat duplicate what the regex matcher is doing). As you go through each character in the test string, a new pointer to the trie’s root is created, and existing pointers to the corresponding child are advanced (if any). When any pointer reaches a leaf, you obtain a match.

Answered by Zach Scrivena

Solution #4

Marc’s response was good, but the Contains matching has to be CaSe InSenSiTiVe.

The answer was simple:

bool b = listOfStrings.Any(s => myString.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0))

Answered by WhoIsRich

Solution #5

This is an old question. However, because VB.NET was the initial requirement. Using the approved answer’s values as a guide:

listOfStrings.Any(Function(s) myString.Contains(s))

Answered by Luis Lavieri

Post is based on