在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;
}
我想取消必须有三行比较代码。
谢谢!
答案 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]");