在 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;
}
我想取消必须有三行比较代码。
谢谢!
你可以使用这样的东西:
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);
如果您实际上是在寻找字符串中的单个字符,则可以使用IndexOfAny
return letters.IndexOfAny('a', 'b', 'c') >= 0;
它对整个字符串进行一次传递,并将字符串中的每个字符与传入的字符进行比较。
如果不存在任何字符,则仍然是 M * N 比较(与上面的 3 if 相同),但如果确实存在任何字符,它会更快地摆脱闪避。
同样对于较长的字符串,它对 CPU 缓存内存更友好。
您可以使用Intersect
来查看两个字符集之间是否有任何共同字符。请注意,字符串实现IEnumerable<char>
,因此您可以将所有字符串视为字符序列。
bool result = "abc".Intersect(letters).Any();
请注意,此解决方案将所有字符letters
放入 aHashSet
中,因此将比当前发布的其他解决方案高效得多,这些解决方案对字符串执行多个线性搜索,假设字符串具有非平凡的大小,并且搜索字符不在开头附近。(你确实说过效率很重要。)
最简单的解决方案是club three if in single statement
或可以Any()
像丹尼尔提到的那样使用。
if (letters.Contains("a") || letters.Contains("b") || letters.Contains("c"))
{
return true;
}
LINQ是要走的路。
return letters.Any(c => c == 'a' || c == 'b' || c == 'c');
var arr = new []{"a","b","c"};
letters.Any(m => arr.Contains(m))
使用String.IndexOfAny(Char[]
)方法怎么样?
string letters = "a,b,c,d,e,f";
if ((letters.IndexOfAny(new char[] { 'a', 'b', 'c' }) >= 0))
{
return true;
}
此实例中第一次出现的从零开始的索引位置,其中任何字符在 anyOf 中被发现;-1 如果在 anyOf 中没有找到任何字符。
您可以使用正则表达式,但我无法保证效率,您必须进行比较并获取时间:
return Regex.IsMatch(letters, "[abc]");