对于下面的代码块:

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

其他回答

myList.Any(myString.Contains);

使用LINQ,使用c#(我现在不太懂VB):

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

或者(更短更有效,但可以说不太清楚):

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

如果您正在测试相等性,那么值得查看HashSet等,但这对部分匹配没有帮助,除非您将其分割为片段并添加一个复杂的顺序。


更新:如果你真的是指“StartsWith”,那么你可以对列表进行排序并将其放入数组;然后使用Array。BinarySearch来查找每一项-通过查找来检查它是完全匹配还是部分匹配。

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

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

当我需要检查一个(长)字符串列表中是否有项目时,我最终得到了这个:

listOfStrings.Any(x => myString.ToUpper().Contains(x.ToUpper()));

或者在vb.net中:

listOfStrings.Any(Function(x) myString.ToUpper().Contains(x.ToUpper()))

Contains方法的缺点是它不允许指定比较类型,这在比较字符串时通常很重要。它总是区分区域性和大小写的。所以我认为WhoIsRich的答案是有价值的,我只是想展示一个更简单的选择:

listOfStrings.Any(s => s.Equals(myString, StringComparison.OrdinalIgnoreCase))