2013-06-20 8 views
21

Cシャープ.NETにはEqualsメソッドとSetEqualsメソッドがあります。違いはどこですか?セットには別のequalsメソッドがあるのはなぜですか?

Javaから来て、私の最初の考えはSetEqualsが必要ではないということです。すべてのオブジェクトに対してEqualsメソッドを使用してください。

+1

「ISet .SetEquals' http://msdn.microsoft.com/en-us/library/dd412096.aspx? – Jodrell

+2

私はドキュメンテーションが違いが何であるかについてかなり明確だと思います。 –

答えて

32

SetEqualsは、Equalsと同じ契約に従っていません。引数はISet<T>ではなく、ちょうどIEnumerable<T>なので、特に対称ではありません。これにより、の1つだけがに設定されている間、設定された等価性をチェックすることができます。考えてみましょう:

List<int> intList = new List<int> { 1, 2, 3 }; 
HashSet<int> intSet = new HashSet<int>(intList); 

を今は使用することができます。

Console.WriteLine(intSet.SetEquals(intList)); 

を...しかし、我々はList<int>で同じ動作と他のすべてのIEnumerable<T>実装を強制することなく、同じようにEqualsを実装することができませんでした。

他のセットに制限しても、平等が本当に何を意味するのかという興味深い質問があります。たとえば、同じ文字列を含む2つのHashSet<string>セットを考えてみましょう。 (たぶん大文字と小文字は区別されますが、そうではありません)。 SetEqualsは、あまりにも一般的であることを避けることによって、このような哲学的な問題を避けることができます。

HashSet<int>SortedSet<int>はどうなりますか?彼らはいつまでも平等だろうか?それらは同じ値を持つことができますが、1つの順序は未定義です。

全体として、Object.EqualsObject.GetHashCodeのアイデアは私の見解では広すぎます。多くの場合、特定のタイプの平等のが必要です。最初は、オブジェクトを平等のために比較することは意味がありません。これはまったく異なる暴言の対象を簡単に形成する可能性がありますが、その間に.NETがこの過度に広いアイデアをコレクションに適用しようとしていないことは少なくとも喜んでいます。明確に定義された意味を持つSetEqualsを使用する能力は、IMOにより有効です。

3

Equals 2つの間の参照平等のチェックとSetEqualsは、コレクションの要素をチェックします。

10

HashSet<T>.SetEqualsは、HashSetに指定のIEnumerable<T>と同じ要素が含まれているかどうかを判断します。しかし、型が異なる場合、なぜそれが真になるべきですか?

HashSet<int> h = new HashSet<int>(); 
h.Add(0); 
h.Add(1); 
int[] ints = new[] { 0, 1, 1, 0 }; 
h.SetEquals(ints); // true, ignores duplicates because it's a set 
h.Equals(ints); // false, correct because not even the same types 

MSDN

SetEquals方法は、重複するエントリおよび他のパラメータ内 要素の順序を無視する..... HasetSet<T>ので

Equalsをオーバーライドしないが使用します参照を単に比較するオブジェクトから継承したものです。したがって、2つのオブジェクトが同じ参照でない場合は、falseを返します。

5
  • Equals 2つのHashSetが同じオブジェクトであるかどうかをテストします。
  • SetEqualsIEnumerable<T>をとります。それは何ですか。"SetEqualsメソッドは、重複するエントリと他のパラメータの要素の順序を無視します。"

だからSetEqualsは、あなたがHashSetのにでてIEnumerableをロードした場合、確認するために、それはあなたのソースと同じHashSetのを生成するテストのためです。

0

SetEquals:

チェックHashSetのは、所与のIEnumerableを<T>と同じ要素を含む場合。

SetEqualsメソッドは、2番目のコレクションを重複要素がないものとして扱います。重複する要素が存在する場合、2つのコレクションは同じとみなされます。

等しい:

等しいが、実際に参考試験

0
List<string> stringList = new List<string> { "a", "b", "c" }; 
SortedSet<string> stringSet = new SortedSet<string> { "a", "b", "c" }; 

bool a = stringSet.SetEquals(stringList); 
// See if the two collections contain the same elements. 

あるISet<T>.SetEquals実装

は現在のセットと指定されたコレクションは、同じが含まれているかどうかを決定し要素。

Equals実装はobject

も参照メソッドの呼び出しに相当するから継承されました。

継承ReferenceEquals実装、

は、指定されたオブジェクトインスタンスが同一かどうかを判断します。


はpaticularでは、SetEqualsに渡されたIEnumerable<T>シーケンスは、任意の順序で、セットのすべてのメンバーの1つ以上のインスタンスを持つことができることに注意してください、とSetEqualsはまだtrueを返します。


あなたは、2つの配列が、あなたがSequenceEqual拡張子を使用することができ、同じ順序で正確に同じメンバーが含まれていることを確認したい場合。

0
public static void Main(string[] args) 
     { 
      Console.WriteLine("Hello World!"); 

      System.Collections.Generic.HashSet<int> setA= new System.Collections.Generic.HashSet<int>(); 
      setA.Add(1); 
      System.Collections.Generic.HashSet<int> setB= new System.Collections.Generic.HashSet<int>(); 
      setB.Add(1); 


      Console.WriteLine("Equals method returns {0}", setA.Equals(setB)); 
      Console.WriteLine("SetEquals method returns {0}", setA.SetEquals(setB)); 


      Console.Write("Press any key to continue . . . "); 
      Console.ReadKey(true); 
     } 

は出力を生成します。 は、equalsメソッドはFalse SetEquals方法を返すequalsメソッドは、したがって、参照平等に関するテストであるように思わ真

を返します。

関連する問題