对于下面的代码块:

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

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


当前回答

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

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

其他回答

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

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

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

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

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


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

之前有一个类似的问题“从大量的可比较列表中测试现有字符串的最佳方法”,这里有许多建议。

Regex可能足以满足您的需求。表达式将是所有候选子字符串的连接,它们之间有一个OR“|”操作符。当然,在构建表达式时,您必须注意未转义的字符,或者由于复杂性或大小限制而编译失败。

另一种方法是构造一个trie数据结构来表示所有候选子字符串(这可能在某种程度上重复正则表达式matcher所做的工作)。当您逐步遍历测试字符串中的每个字符时,您将创建一个指向树根的新指针,并将现有指针推进到适当的子节点(如果有的话)。当任何指针到达叶节点时,就会得到匹配。

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

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

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

这就是解决方案:

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