0

在 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;
}

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

谢谢!

4

8 回答 8

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);
于 2013-08-20T13:38:40.310 回答
4

如果您实际上是在寻找字符串中的单个字符,则可以使用IndexOfAny

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

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

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

于 2013-08-20T13:39:44.053 回答
2

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

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

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

于 2013-08-20T13:44:05.607 回答
1

最简单的解决方案是club three if in single statement或可以Any()丹尼尔提到的那样使用。

if (letters.Contains("a") || letters.Contains("b") || letters.Contains("c"))
{
    return true;
}
于 2013-08-20T13:38:14.710 回答
1

LINQ是要走的路。

return letters.Any(c => c == 'a' || c == 'b' || c == 'c');
于 2013-08-20T13:39:33.927 回答
0
var arr = new []{"a","b","c"};
letters.Any(m => arr.Contains(m))
于 2013-08-20T13:40:40.463 回答
0

使用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 中没有找到任何字符。

于 2013-08-20T13:41:03.020 回答
0

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

return Regex.IsMatch(letters, "[abc]");
于 2013-08-20T13:42:53.783 回答