检查一个字符串是否包含来自一个字符串列表中的元素

230

以下是一段代码块:

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)进行匹配检查。

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

14个回答

0
稍有不同,我需要在字符串中查找是否存在整个单词且不区分大小写。
myString.Split(' ', StringSplitOptions.RemoveEmptyEntries).Intersect(listOfStrings).Any())

对于不区分大小写的 myStringlistOfStrings 已被转换为大写字母。


0
如果速度很重要,您可能想要寻找适用于模式集的Aho-Corasick算法
它是一个带有失败链接的trie,即复杂度为O(n+m+k),其中n是输入文本的长度,m是模式的累积长度,k是匹配数。您只需要修改算法,在找到第一个匹配项后终止即可。

0
这不是一个很大的代码块,但这是一个很好的使用情况,可以使用扩展方法来提供可重用性、可读性和文档化
public static class StringExtensions
{
    /// <summary>
    /// Tests whether any of the entries in the search list can be found in the source string
    /// </summary>
    public static bool ContainsAny(this string source, IEnumerable<string> search)
    {
        return search.Any(source.Contains);
    }
}

public static class LinqExtensions
{
    /// <summary>
    /// Tests whether the any value in the source list matches any of the values in the search list
    /// </summary>
    public static bool ContainsAny<T>(this IEnumerable<T> source, IEnumerable<T> search)
    {
        return source.Any(search.Contains);
    }
}

然后你可以像这样使用字符串:

var containsMatch = "Hello World".ContainsAny(new[] { "World", "Earth" }); // true

或者对于字符串可以这样写:

var list = new [] {"a","b"};
var containsMatch = list.ContainsAny(new [] {"b", "c"}); // true

CodePen演示

类似问题:


0

不区分大小写的扩展

 public static bool ContainsAnyOfKeys(this string text,List<string> keys)
 {
     bool b = keys.Any(s => text.Contains(s,StringComparison.CurrentCultureIgnoreCase));
     return b;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接