对于下面的代码块:

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

输出结果为:

案例1:

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

案例2:

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

列表(listOfStrings)可能包含几个项目(至少20个),它必须检查成千上万的字符串(如myString)。

是否有更好(更有效)的方法来编写这段代码?


当前回答

老问题。但是自从VB。NET是最初的需求。使用已接受答案的相同值:

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

其他回答

当你构造你的字符串时,它应该是这样的

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

如果速度很关键,您可能想要寻找模式集的Aho-Corasick算法。

它是一个带有失败链接的trie,即复杂度为O(n+m+k),其中n是输入文本的长度,m是模式的累积长度,k是匹配的数量。您只需修改算法,以便在找到第一个匹配后终止。

老问题。但是自从VB。NET是最初的需求。使用已接受答案的相同值:

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

你测试过速度了吗?

例如,你是否创建了一组样本数据并对其进行了分析?可能没有你想的那么糟。

这也可能是你可以衍生到一个单独的线程,给速度的错觉!

我喜欢Marc的回答,但需要Contains匹配不区分大小写。

这就是解决方案:

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