快速多字符串比较

时间:2013-08-20 13:36:20

标签: c# string linq

在c#中有一种快速的方法可以用更高效的代码替换以下内容:

string letters = "a,b,c,d,e,f";

if (letters.Contains("a"))
{
    return true;
}

if (letters.Contains("b"))
{
    return true;
}

if (letters.Contains("c"))
{
    return true;
}

我想取消必须有三行比较代码。

谢谢!

8 个答案:

答案 0 :(得分:8)

您可以使用以下内容:

return letters.Any(c => c == 'a' || c == 'b' || c == 'c');

或者这个:

var lettersToLookFor = "abc";
return letters.Any(c => lettersToLookFor.Contains(c));

根据评论,可以进一步缩短前一个代码块的最后一行:

return letters.Any(lettersToLookFor.Contains);

答案 1 :(得分:4)

如果你真的在字符串中寻找单个字符,可以使用IndexOfAny

return letters.IndexOfAny('a', 'b', 'c') >= 0;

它对整个字符串进行一次传递,并将字符串中的每个字符与传入的字符进行比较。

如果没有一个字符存在,它仍然是M * N比较(如上所述为3),但是如果存在任何字符,它会更快地避开闪避。
对于更长的字符串,它在CPU高速缓存存储器上更友好。

答案 2 :(得分:3)

您可以使用Intersect查看两个字符集之间是否存在任何共同字符。请注意,字符串实现IEnumerable<char>,因此您可以将所有字符串视为字符序列。

bool result = "abc".Intersect(letters).Any();

请注意,此解决方案,因为它将letters中的所有字符放入HashSet,将比当前发布的对字符串执行多个线性搜索的其他解决方案更有效,假设字符串具有非平凡的大小,并且搜索字符不在开头附近。 (你确实说效率很重要。)

答案 3 :(得分:1)

最简单的解决方案是club three if in single statement,或者可以使用Any(),例如Daniel

if (letters.Contains("a") || letters.Contains("b") || letters.Contains("c"))
{
    return true;
}

答案 4 :(得分:1)

LINQ是要走的路。

return letters.Any(c => c == 'a' || c == 'b' || c == 'c');

答案 5 :(得分:0)

var arr = new []{"a","b","c"};
letters.Any(m => arr.Contains(m))

答案 6 :(得分:0)

如何使用String.IndexOfAny(Char[])方法?

string letters = "a,b,c,d,e,f";

if ((letters.IndexOfAny(new char[] { 'a', 'b', 'c' }) >= 0))
{
   return true;
}
  

此实例中第一次出现的从零开始的索引位置   anyOf中的任何字符被发现的地方;如果anyOf中没有字符,则为-1   被发现了。

答案 7 :(得分:0)

你可以使用正则表达式,我无法保证效率,但你必须进行比较并获得时间:

return Regex.IsMatch(letters, "[abc]");