Cシャープ.NETにはEquals
メソッドとSetEquals
メソッドがあります。違いはどこですか?セットには別のequalsメソッドがあるのはなぜですか?
Javaから来て、私の最初の考えはSetEquals
が必要ではないということです。すべてのオブジェクトに対してEquals
メソッドを使用してください。
Cシャープ.NETにはEquals
メソッドとSetEquals
メソッドがあります。違いはどこですか?セットには別のequalsメソッドがあるのはなぜですか?
Javaから来て、私の最初の考えはSetEquals
が必要ではないということです。すべてのオブジェクトに対してEquals
メソッドを使用してください。
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.Equals
とObject.GetHashCode
のアイデアは私の見解では広すぎます。多くの場合、特定のタイプの平等のが必要です。最初は、オブジェクトを平等のために比較することは意味がありません。これはまったく異なる暴言の対象を簡単に形成する可能性がありますが、その間に.NETがこの過度に広いアイデアをコレクションに適用しようとしていないことは少なくとも喜んでいます。明確に定義された意味を持つSetEquals
を使用する能力は、IMOにより有効です。
Equals
2つの間の参照平等のチェックとSetEquals
は、コレクションの要素をチェックします。
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
を返します。
Equals
2つのHashSet
が同じオブジェクトであるかどうかをテストします。SetEquals
はIEnumerable<T>
をとります。それは何ですか。"SetEqualsメソッドは、重複するエントリと他のパラメータの要素の順序を無視します。"だからSetEquals
は、あなたがHashSetのにでてIEnumerableをロードした場合、確認するために、それはあなたのソースと同じHashSetのを生成するテストのためです。
SetEquals:
チェックHashSetのは、所与のIEnumerableを
<T>
と同じ要素を含む場合。SetEqualsメソッドは、2番目のコレクションを重複要素がないものとして扱います。重複する要素が存在する場合、2つのコレクションは同じとみなされます。
等しい:
等しいが、実際に参考試験
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.
は現在のセットと指定されたコレクションは、同じが含まれているかどうかを決定し要素。
Equals
実装はobject
も参照メソッドの呼び出しに相当するから継承されました。
継承ReferenceEquals実装、
は、指定されたオブジェクトインスタンスが同一かどうかを判断します。
はpaticularでは、SetEquals
に渡されたIEnumerable<T>
シーケンスは、任意の順序で、セットのすべてのメンバーの1つ以上のインスタンスを持つことができることに注意してください、とSetEquals
はまだtrueを返します。
あなたは、2つの配列が、あなたがSequenceEqual
拡張子を使用することができ、同じ順序で正確に同じメンバーが含まれていることを確認したい場合。
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メソッドは、したがって、参照平等に関するテストであるように思わ真
を返します。
「ISet .SetEquals' http://msdn.microsoft.com/en-us/library/dd412096.aspx? –
Jodrell
私はドキュメンテーションが違いが何であるかについてかなり明確だと思います。 –