if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))
上面的代碼是我的,我想知道如果我有一個更長的字符串列表相同的條件,我怎麼做,而不會使代碼太長。也許是lambda表達式?有沒有一種方法來評估string.contains()方法內的多個字符串?
if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))
上面的代碼是我的,我想知道如果我有一個更長的字符串列表相同的條件,我怎麼做,而不會使代碼太長。也許是lambda表達式?有沒有一種方法來評估string.contains()方法內的多個字符串?
不,沒有內置功能。但它不是很難自己動手寫:
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()
和不區分大小寫的比較可能會返回不同的結果,但只有在您的乾草堆和針頭中有不尋常的字符時纔會有相關的結果。
爲什麼不只是'needles.Contains(haystack)'?編輯:我看到了問題,我的不好。在這裏顯示什麼不能做:) – leppie
+1因爲更好的變量命名;-) – Jon
@leppie,因爲這需要整個字符串的匹配。 – CodesInChaos
可以返工的代碼是這樣的:
var words = new[] { "BOUGHT", "PURCHASE" };
var desc = description.ToUpper();
if(words.Any(w => description.Contains(w)) {
// something matched
}
if (someCollectionOfStrings.Any(string => originalString.Contains(string))
{
//stuff
}
這失去了不區分大小寫。 – CodesInChaos
@CodeInChaos - 是的,但他沒有要求區分大小寫。他要求提供一種檢查條件的多個字符串的方法,最好是用lambda表達式。這是我發佈的。 –
原始代碼使用'ToUpper'和大寫關鍵字。所以我很確定他希望不區分大小寫。 – CodesInChaos
Regex.IsMatch(input, string.Join("|", strings));
您可能需要逃避串是否含有正則表達式控制字符。
謝謝@GvS,當方法有一個愚蠢的參數順序時,請保持忘記... – leppie
if (Regex.IsMatch(description, "purchase|bought", RegexOptions.IgnoreCase)) {
// ...
}
+1。這應該編譯成一個狀態機,它應該比調用Contains多次(無論是通過||還是Any)提供更好的性能。 –
public static bool ContainsOneOfManyIgnoreCase(this string str, params string [] items)
{
return items.Any(x => str.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) != -1);
}
你可以和應該緩存description.ToUpper'的'結果。 – Jon
你可能不應該使用'ToUpper' ......使用'IndexOf'和適當的'StringComparison'。上層腸衣以有時令人驚訝的方式對文化敏感。 –
非常感謝所有的答案。我幾乎都採用了概念。 :D –