2011-10-25 446 views
1
if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE")) 

上面的代碼是我的,我想知道如果我有一個更長的字符串列表相同的條件,我怎麼做,而不會使代碼太長。也許是lambda表達式?有沒有一種方法來評估string.contains()方法內的多個字符串?

+2

你可以和應該緩存description.ToUpper'的'結果。 – Jon

+4

你可能不應該使用'ToUpper' ......使用'IndexOf'和適當的'StringComparison'。上層腸衣以有時令人驚訝的方式對文化敏感。 –

+0

非常感謝所有的答案。我幾乎都採用了概念。 :D –

回答

7

不,沒有內置功能。但它不是很難自己動手寫:

string[] needles = new string[]{"BOUGHT", "PURCHASE"}; 
string haystack = description.ToUpperInvariant(); 
bool found = needles.Any(needle=> haystack.Contains(needle)); 

我只轉換hackstack到上一次以提高性能。

另外,您可以使用IndexOf(needle, StringComparison.OrdinalIgnoreCase)>=0

string[] needles = new string[]{"BOUGHT", "PURCHASE"}; 
string haystack = description; 
bool found = needles.Any(needle=> haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase)>=0); 

你不應該使用ToUpper()這裏,因爲使用目前的文化。使用當前文化可能會導致某些計算機出現意外問題,例如i在使用土耳其文化時不會大寫到I

可能還存在一些細微的問題,其中兩側的ToUpperInvariant()和不區分大小寫的比較可能會返回不同的結果,但只有在您的乾草堆和針頭中有不尋常的字符時纔會有相關的結果。

+0

爲什麼不只是'needles.Contains(haystack)'?編輯:我看到了問題,我的不好。在這裏顯示什麼不能做:) – leppie

+0

+1因爲更好的變量命名;-) – Jon

+0

@leppie,因爲這需要整個字符串的匹配。 – CodesInChaos

2

可以返工的代碼是這樣的:

var words = new[] { "BOUGHT", "PURCHASE" }; 
var desc = description.ToUpper(); 
if(words.Any(w => description.Contains(w)) { 
    // something matched 
} 
1
if (someCollectionOfStrings.Any(string => originalString.Contains(string)) 
{ 
    //stuff 
} 
+0

這失去了不區分大小寫。 – CodesInChaos

+0

@CodeInChaos - 是的,但他沒有要求區分大小寫。他要求提供一種檢查條件的多個字符串的方法,最好是用lambda表達式。這是我發佈的。 –

+0

原始代碼使用'ToUpper'和大寫關鍵字。所以我很確定他希望不區分大小寫。 – CodesInChaos

1
Regex.IsMatch(input, string.Join("|", strings)); 

您可能需要逃避串是否含有正則表達式控制字符。

+1

謝謝@GvS,當方法有一個愚蠢的參數順序時,請保持忘記... – leppie

1

Use a regular expression:

if (Regex.IsMatch(description, "purchase|bought", RegexOptions.IgnoreCase)) { 
    // ... 
    } 
+0

+1。這應該編譯成一個狀態機,它應該比調用Contains多次(無論是通過||還是Any)提供更好的性能。 –

0
public static bool ContainsOneOfManyIgnoreCase(this string str, params string [] items) 
    { 
     return items.Any(x => str.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) != -1); 
    } 
相關問題