web-dev-qa-db-ja.com

2つの文字列を比較し、C#の大文字小文字を区別しない

可能な重複:
異なる文字列比較方法の違いは何ですか

次の2つのうちどれがより効率的ですか? (あるいはもっと良い3つ目の選択肢はあるのでしょうか。)

string val = "AStringValue";

if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))

OR

if (val.ToLowerCase() == "astringvalue")

268
Patrick

2番目の 'ソリューション'が新しい文字列インスタンスをインスタンス化するので、最初のものが正しいもので、私見がより効率的なものです。

150

効率を求めているなら、これを使ってください:

string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)

通常の比較は、カルチャ対応の比較よりもかなり高速です。

ただし、同じ文字列に対して多くの比較を行っている場合は、ToLowerCaseを使用するのがより良い方法です。

他のパフォーマンス最適化と同様に、 それを測定してから決定します。

226
Sven

.ToLowerCaseバージョンはそれほど速くはありません - 追加の文字列割り当て(後で収集する必要があります)などを含みます.

個人的には

string.Equals(val, "astringvalue",  StringComparison.OrdinalIgnoreCase)

これはカルチャセンシティブ文字列のすべての問題を回避しますが、結果として カルチャセンシティブ文字列のすべての問題を回避します 。あなただけがあなたの文脈でそれが問題ないかどうかを知っています。

string.Equals静的メソッドを使用すると、valnullであるという問題を回避できます。

29
Marc Gravell

「効率」に関するこの種の質問に対する私の一般的な答えは、ほとんどの場合、コードのどのバージョンが最も読みやすく、最も効率的であるかということです。

そうは言っても、(val.ToLowerCase() == "astringvalue")は一目でほとんどの人に理解しやすいと思います。

私が言及する効率は、コードの実行に不可欠ではなく、むしろ問題となっているコードの保守性と一般的な読みやすさにあります。

11
Jamie Dixon

最も安全なのは、valがnullである可能性を減らすために String.Equals を使うことです。

5
spender

前者が最速です。 valは不変であることがわかったので、単に文字列比較子と直接比較するのではなく、String.ToLowerCase()で新しい文字列オブジェクトを作成します。あなたが1秒間に何度もこれをしている場合、新しい文字列オブジェクトを作成することはコストがかかる可能性があります。

4
foxy

あなたはまた、すでに答えられた質問を見たいと思うかもしれません C#の文字列比較方法の違い /

2
Tomasz Jaskuλa

Stringsは不変なので、val.ToLowerCase()は新しいオブジェクトを作成するので、1stがより効率的です(そして可能な限り最良の選択肢です)。

1
Грозный