[C#] C#の文字列比較メソッドの違い


Answers

MSDNから:

2つの文字列が等しいかどうかを判断するには、Equalsメソッドを呼び出します。このメソッドは、2つの文字列が等しいかどうかを判断するために使用します。 "

彼らは、 .CompareTo代わりに.Equals使うことを提案しています。 .Equals==間にstringクラスの違いがあるかどうかは.Equalsません。 私はときどき誰かが後で来て、そのクラスの==演算子を再定義する場合に、自分のクラスに==代わりに.EqualsまたはObject.ReferenceEquals使用します。

Question

C#の文字列を比較するのは簡単です。 実際には、いくつかの方法があります。 私は下のブロックにいくつか挙げました。 私が興味を持っているのは、それらの違いと、他のものよりも使い分けるべきときです。 1つのコストで回避する必要がありますか? 私はまだリストに載っていないのですか?

string testString = "Test";
string anotherString = "Another";

if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}

(注:私は、この例では平等を求めていますが、それ以下であっても大きくはありませんが、それについても自由にコメントしてください)




あなたがこれを行う必要がある時代の99%でその性能が重要ではないのですが、これを数百万回繰り返す必要があるなら、私はあなたが文字を見つけたら直ちに.Equalsまたは==を使うことを強く勧めます一致しない場合はfalseを返しますが、CompareToを使用すると、どちらの文字が他の文字よりも小さいかを把握して、パフォーマンスの時間が少し悪化します。

あなたのアプリケーションが異なる国で動いているなら、CultureInfoの意味を見て、おそらく.Equalsを使うことをお勧めします。 私は実際に米国向けのアプリしか書いていないので(それが誰かによって正しく動作しないかどうかは気にしないでください)、私は常に==を使用します。




.Equalsを使うと、StringComparisonオプションも得られます。 大文字と小文字を無視するのに非常に便利です。

btw、これはfalseと評価されます

string a = "myString";
string b = "myString";

return a==b

==はaとb(ポインタ)の値を比較するので、ポインタがメモリ内の同じオブジェクトを指す場合にのみ、これは真と評価されます。 .Equalsはポインタを逆参照し、ポインタに格納されている値を比較します。 a.Equals(b)はここで真実です。

bをbに変更した場合:

b = "MYSTRING";

a.Equals(b)はfalseですが、

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

本当だろう

a.CompareTo(b)は、ポインタの値を比較し、aに格納された値がbに格納されている値より小さい場合は<0を返し、a.Equals(b)がtrueの場合は0を返し、それ以外の場合は0を返します。 しかし、これは大文字と小文字を区別しているので、CompareToが大文字と小文字を無視するオプションがあると思われますが、今見る時間はありません。 既に述べたように、これはソートのために行われます。 このように等価性を比較すると、必要以上のオーバーヘッドが発生します。

私は物事を残していると確信していますが、詳細が必要な場合は、これが実験を開始するのに十分な情報であるはずです。




注意すべき大きな違いは、最初の文字列がnullの場合、Escape()は例外をスローします。ただし、==は例外ではありません。

       string s = null;
        string a = "a";
        //Throws {"Object reference not set to an instance of an object."}
        if (s.Equals(a))
            Console.WriteLine("s is equal to a");
        //no Exception
        if(s==a)
            Console.WriteLine("s is equal to a");



Ed述べたように、CompareToはソートに使用されます。

しかし、.Equalsと==の間には違いがあります。

== 本質的に次のコードに解決されます:

if(object.ReferenceEquals(left, null) && 
   object.ReferenceEquals(right, null))
    return true;
if(object.ReferenceEquals(left, null))
    return right.Equals(left);
return left.Equals(right);

単純な理由は、次の例外がスローされます:

string a = null;
string b = "foo";

bool equal = a.Equals(b);

そして、次のことはしません:

string a = null;
string b = "foo";

bool equal = a == b;



CompareToは、文字列と文字列オブジェクトを比較し、int値を返します。 値が0の場合は、文字列が等しいことを意味します。

string country = "southindia";
object ob1 = country.Clone();
Console.WriteLine( country.CompareTo(ob1));

string country = "southindia";
string cou = "insia";
int n = country.CompareTo(cou);
Console.WriteLine( n );