对于以下代码块:
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)进行检查.
是否有更好(更有效)的方法来编写此代码?
使用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));
从早先的类似问题" 针对大量可比数据的现有字符串测试的最佳方法 "中提出了许多建议.
正则表达式可能足以满足您的要求.表达式将是所有候选子串的串联,|
它们之间带有OR" "运算符.当然,在构建表达式时,您必须注意未转义的字符,或者由于复杂性或大小限制而无法编译它.
另一种方法是构造一个trie数据结构来表示所有候选子串(这可能与正则表达式匹配器正在做的有些重复).当您单步执行测试字符串中的每个字符时,您将创建一个指向trie根的新指针,并将现有指针推进到相应的子节点(如果有).当任何指针到达叶子时,你得到一个匹配.