簡體   English   中英

快速多字符串比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM