C Sharp .NET にはEquals
メソッドとメソッドがありSetEquals
ます。違いはどこにありますか?
Java から来て、私が最初に考えたのは、それは必要ないということでした。すべてのオブジェクトに対してメソッドをSetEquals
使用するだけです。Equals
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
。
Equals
HashSet
2 つの が同じオブジェクトかどうかをテストします。SetEquals
「 SetEqualsメソッドIEnumerable<T>
は、重複するエントリと他のパラメータの要素の順序を無視します。」 これSetEquals
は、IEnumerable を HashSet にロードしたかどうかをテストするためのもので、ソースと同じ HashSet が生成されます。
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 メソッドは、参照の等価性のテストのようです。
現在のセットと指定されたコレクションに同じ要素が含まれているかどうかを判断します。
Equals
から継承された実装object
ReferenceEquals メソッドの呼び出しと同等です。
継承されたReferenceEquals実装、
指定された Object インスタンスが同じインスタンスかどうかを判断します。
IEnumerable<T>
特に、 に渡されるシーケンスSetEquals
は、セットのすべてのメンバーの 1 つ以上のインスタンスを任意の順序で持つことができ、SetEquals
それでも true を返すことに注意してください。
2 つのシーケンスにまったく同じメンバーが同じ順序で含まれていることを確認したい場合は、SequenceEqual
拡張子を使用できます。