26

C Sharp .NET にはEqualsメソッドとメソッドがありSetEqualsます。違いはどこにありますか?

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

4

7 に答える 7

13

HashSet<T>.SetEquals指定された と同じ要素が HashSet に含まれているかどうかを判断しIEnumerable<T>ます。しかし、タイプが異なる場合に true を返す必要があるのはなぜですか?

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

于 2013-06-20T14:04:39.673 に答える
8
  • EqualsHashSet2 つの が同じオブジェクトかどうかをテストします。
  • SetEquals「 SetEqualsメソッドIEnumerable<T>、重複するエントリと他のパラメータの要素の順序を無視します。」

これSetEqualsは、IEnumerable を HashSet にロードしたかどうかをテストするためのもので、ソースと同じ HashSet が生成されます。

于 2013-06-20T14:04:58.233 に答える
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 メソッドは True を返します

したがって、equals メソッドは、参照の等価性のテストのようです。

于 2013-06-20T14:16:14.167 に答える
0

ISet<T>.SetEquals実装_

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

Equalsから継承された実装object

ReferenceEquals メソッドの呼び出しと同等です。

継承されたReferenceEquals実装、

指定された Object インスタンスが同じインスタンスかどうかを判断します。


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


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

于 2013-06-20T14:11:16.003 に答える