[英]Fast multiple string compare
在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個相同),但是如果確實存在任何字符,則可以更快地擺脫閃避。
同樣,對於更長的字符串,它在CPU緩存上也比較友好。
您可以使用“ Intersect
來查看兩個字符集之間是否有共同的字符。 請注意,字符串實現IEnumerable<char>
,因此您可以將所有字符串都視為字符序列。
bool result = "abc".Intersect(letters).Any();
請注意,此解決方案會將letters
所有字符都放入HashSet
,因此比當前發布的在字符串上執行多個線性搜索的其他解決方案(假設字符串的大小不重要)的效率要高得多。 ,並且搜索字符不在開始位置附近。 (您確實說過效率很重要。)
最簡單的解決方案是club three if in single statement
中使用club three if in single statement
或者可以像Daniel提到的那樣使用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中的任何字符; 如果在anyOf中找不到字符,則返回-1。
您可以使用正則表達式,但是我不能保證效率,您必須進行比較並獲取時間安排:
return Regex.IsMatch(letters, "[abc]");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.