C# 快速多字符串比较

C# 快速多字符串比较,c#,string,linq,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; } 我想省去三行代码的比较 谢谢 最简单的解决方案是club three,如果在

在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;
}
我想省去三行代码的比较


谢谢

最简单的解决方案是
club three,如果在一个语句中
,或者可以像前面提到的那样使用
Any()

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

您可以使用以下内容:

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);
LINQ是一条路要走

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

如果要在字符串中查找单个字符,可以使用
IndexOfAny

return letters.IndexOfAny('a', 'b', 'c') >= 0;
它对整个字符串进行一次遍历,并将字符串中的每个字符与传入的字符进行比较

如果不存在任何字符,则仍然是M*N比较(与上面的3个相同),但如果确实存在任何字符,则会更快地脱离道奇。
同样,对于较长的字符串,它在CPU缓存上更友好。

使用类似的方法如何

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

if ((letters.IndexOfAny(new char[] { 'a', 'b', 'c' }) >= 0))
{
   return true;
}
此实例中第一次出现的从零开始的索引位置 在任何地方发现任何字符-1如果其中任何一个中没有字符 被发现了


您可以使用正则表达式,但我不能保证效率,您必须运行比较并获取时间:

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

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

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

请注意,此解决方案将把
字母
中的所有字符放入
哈希集
,因此比当前发布的其他解决方案要高效得多,这些解决方案对字符串执行多个线性搜索,假设字符串的大小不小,并且搜索字符不在开始位置附近。(你说过效率很重要。)

使用linq这里是一个例子,你的用例是什么?你从哪里获得字母或输入?
返回字母。包含(“a”)|字母。包含(“b”)|字母。包含(“c”)
?还有为什么你的测试字符串中有
逗号?这只是下面所有答案的旁白(都很好),我建议您创建一个扩展方法或可重用的静态方法来为您完成这项工作,并隐藏实现细节。没有什么能比得上您自己的自定义签名,比如
字母.HasAny(“abc”)
字母.HasAny('a','b','c')
,或者如果“abc”检查很常见,
字母.HasABC()
(或者任何对您最有意义的名称/签名)。在内部,扩展方法实现可以使用以下任何思想,可以针对速度、维护或灵活性进行优化。Dam,Daniel比我快了一分钟,甚至:
letters.any(lettersToLookFor.Contains)
=0,而不是>0-1是“显著提高效率”:这完全取决于实际字符串。