对于下面的代码块:
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)。
是否有更好(更有效)的方法来编写这段代码?
根据您的模式,一个改进是使用StartsWith而不是Contains。StartsWith只需要遍历每个字符串,直到找到第一个不匹配的字符,而不必在找到一个字符时在每个字符位置重新开始搜索。
同样,根据您的模式,看起来您可能能够提取myString路径的第一部分,然后反向比较——在字符串列表中查找myString的起始路径,而不是相反。
string[] pathComponents = myString.Split( Path.DirectorySeparatorChar );
string startPath = pathComponents[0] + Path.DirectorySeparatorChar;
return listOfStrings.Contains( startPath );
编辑:使用@Marc Gravell提到的HashSet思想会更快,因为您可以将Contains更改为ContainsKey,查找将是O(1)而不是O(N)。你必须确保路径完全匹配。请注意,这不是一个通用的解决方案是@Marc Gravell的,但适合你的例子。
很抱歉是c#的例子。我还没喝够咖啡,没办法翻译成VB。