13

a と b の 2 つの文字列があるとします。大文字と小文字を区別しない場合に a と be の値が同じかどうかを比較するために、私は常に以下を使用してきました。

// (Assume a and b have been verified not to be null)

if (a.ToLower() == b.ToLower())

ただし、Reflector を使用すると、.NET Framework でこれが数回見られます。

// (arg three is ignoreCase)

if (string.Compare(a, b, true) == 0)

どちらが速いか、使用した弦で毎回ToLower()ビートをテストしました。Compare()

Compare()代わりにする理由はありToLower()ますか?違うことについて何かCultureInfo?頭をかいてます。

4

6 に答える 6

23

あなたが気にするべき主なことはパフォーマンスではなく、正確さです。その観点から、大文字と小文字を区別しない比較に使用したい方法は次のいずれかです

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;

また

a.Equals(b, StringComparison.OrdinalIgnoreCase)

(最初のものは、文字列が null である可能性があることがわかっている場合に役立ちます。後者は、少なくとも 1 つの文字列が null でないことが既にわかっている場合は、より簡単に記述できます。パフォーマンスをテストしたことはありませんが、同様であると想定しています。)

OrdinalまたはOrdinalIgnoreCase、別の比較方法を使用したいことがわかっていない限り、安全な賭けです。決定を下すために必要な情報を取得するには、MSDN のこの記事をお読みください

于 2009-02-02T00:38:31.377 に答える
6

MSDN 記事の備考セクションで説明する必要があります。基本的に、その理由は、異なるカルチャ設定間の互換性のためです。

于 2009-02-02T00:41:34.363 に答える
3

文字列を比較するときは、常に明示的な StringComparison メンバーを使用する必要があります。文字列関数は、文字列を比較する方法に多少の一貫性がありません。使用される比較を保証する唯一の方法は、a) それらをすべて記憶する (これには、あなたとチームの全員の両方が含まれます) か、b) すべての関数に対して明示的な比較を使用することです。

グループの知識が完璧であることに頼るのではなく、明確にする方がはるかに優れています。あなたのチームメイトはこれに感謝します。

例:

if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )

比較のためにToLowerを使用すると、頭のてっぺんから考えることができる2つの問題があります

  1. メモリを割り当てます。絶対に必要でない限り、比較関数はメモリを割り当てるべきではありません。
  2. 弦はいくつかの方法で下げることができます。最も注目すべき序数またはカルチャに依存する下位。.ToLower() はどのように機能しますか? 個人的にはわかりません。デフォルトに依存するよりも、明示的なカルチャを渡す方がはるかに優れています。
于 2009-02-02T00:40:08.173 に答える
0

ToLower() は比較関数ではなく、文字列を小文字にします。== 演算子が C# の String オブジェクトで使用されると、コンパイラによって最適化されます。Reflector に見られるように、コアでは、どちらも System.String.Equals に依存しています。

于 2009-02-02T00:34:26.080 に答える
0

別の MSDN の記事では、さまざまな場合に使用するべきこととすべきでないこと、および推奨される比較方法について説明しています: Microsoft .NET 2.0 で文字列を使用するための新しい推奨事項

于 2009-02-02T00:51:28.387 に答える