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

上記のコードは私が持っているもので、同じ条件の文字列のリストが長いかどうか、コードを長すぎるとどうしたらいいかと思いました。多分ラムダ式?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を使用することができます:あなたがここにToUpper()を使用してはならない

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

、それは現在のカルチャを使用しているため。現在のカルチャを使用すると、一部のコンピュータで予期しない問題が発生する可能性があります。たとえば、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 - はい、しかし、彼は大文字小文字の区別を求めませんでした。彼は、複数の文字列を条件として、好ましくはラムダ式でチェックする手段を求めました。それが私が投稿したものです。 –

+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); 
    } 
関連する問題