if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))
上記のコードは私が持っているもので、同じ条件の文字列のリストが長いかどうか、コードを長すぎるとどうしたらいいかと思いました。多分ラムダ式?string.contains()メソッドの中で複数の文字列を評価する方法はありますか?
if (description.ToUpper().Contains("BOUGHT") || description.ToUpper().Contains("PURCHASE"))
上記のコードは私が持っているもので、同じ条件の文字列のリストが長いかどうか、コードを長すぎるとどうしたらいいかと思いました。多分ラムダ式?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
を使用することができます:あなたがここにToUpper()
を使用してはならない
string[] needles = new string[]{"BOUGHT", "PURCHASE"};
string haystack = description;
bool found = needles.Any(needle=> haystack.IndexOf(needle, StringComparison.OrdinalIgnoreCase)>=0);
、それは現在のカルチャを使用しているため。現在のカルチャを使用すると、一部のコンピュータで予期しない問題が発生する可能性があります。たとえば、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 - はい、しかし、彼は大文字小文字の区別を求めませんでした。彼は、複数の文字列を条件として、好ましくはラムダ式でチェックする手段を求めました。それが私が投稿したものです。 –
元のコードは、 '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 –