20

次のような場合はありますか?

Equals(MyList1, MyList2) != MyList1.SequenceEqual(MyList2);

そして、次の違いは何ですか:

Equals(obj1, obj2)obj1.Equals(obj2)

ありがとう。

4

3 に答える 3

38

Equalsとが同じインスタンスであるtrue場合にのみ返します。両方のリストに同じアイテムが含まれている場合に返されます。MyList1MyList2
SequenceEqualtrue

例:

var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3 };
var list3 = list1;
var list4 = new List<int> { 1, 2, 3, 4 };

Equals(list1, list2) == false
list1.SequenceEqual(list2) == true

Equals(list1, list3) == true
list1.SequenceEqual(list3) == true

Equals(list1, list4) == false
list1.SequenceEqual(list4) == false

Equals(obj1, obj2)との違いobj1.Equals(obj2)は、前者は静的メソッドObject.Equalsを使用し、後者はインスタンス メソッドを使用することEqualsです。これら 2 つの呼び出しの結果は、obj1オーバーライドのクラスが異なる場合に異なりますObject.Equals

于 2012-05-09T06:57:24.980 に答える
4

最初の質問の 2 番目の部分については、@Daniel が回答しています。

Equals(obj1, obj2) and obj1.Equals(obj2)

obj1.Equals(obj2) はオブジェクトのインスタンス メソッドであり、obj1 が null の場合は例外がスローされます。Equals(obj1,obj2) は静的メソッドであり、obj1 が null の場合に機能します。クラスのEuqals をオーバーライドすることもできます

object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj1.Equals(obj2)); //print false
obj1 = null;
Console.WriteLine(obj1.Equals(obj2)); // will throw exception
Console.WriteLine(Equals(obj1, obj2));// return false in this case and since its static it will not throw the exception
于 2012-05-09T07:08:55.670 に答える
2

一般に、Equalsは「永続的な」同値関係を表すと考えられています。によって参照されるオブジェクトが Y によって参照されるオブジェクトであるとX報告するEquals場合、前者のオブジェクトは常にEquals後者であると報告する必要があります。一般に、可変オブジェクトは、可変オブジェクトの状態がある時点で別のオブジェクトの状態と一致したとしても、常にそうであるという保証はないため、それ自体をそれ自体と同等であると報告することはありません。

対照的に、SequenceEqual は一時的な状態を表します。それが示すのは、呼び出された時点で、両方のオブジェクトの列挙が同じ項目のシーケンスを報告するかどうかだけです。オブジェクトの過去、現在、または将来の状態について、他の約束はしません。

すべてのオブジェクトのタイプが である場合List<string>、次の条件EqualsSequenceEqualテストします。

  • If Xand reference Yto the same object X.Equals(Y)and X.SequenceEqual(Y)will be true. これらの参照が存在し、どちらも別のオブジェクトを指すように作成されていない限り、両方とも true になります。

  • それらが同じ項目を含む別のリストを参照している場合はX.Equals(Y)false になりますが、X.SequenceEqual(Y)true になります。X.SequenceEqual(Y)一方または両方のリストに変更が加えられると、 false になる可能性があることに注意してください。

  • それらが異なる項目を含む異なるリストを参照する場合、 と の両方X.Equals(Y)X.SequenceEquals(Y)false になります。一方または両方のリストに変更が加えられた場合X.SequenceEquals(Y)、true になる可能性がありますが、そうはなりX.Equals(Y)ません。

Equalsリストがスレッドセーフでない方法で使用されている場合 (この場合、すべての賭けがオフになっています)、または標準規約に従わないオブジェクトのリストがない限り、X.Equals(Y)真であるがX.SequenceEquals(Y)偽である方法はありません。

于 2013-09-16T16:37:55.743 に答える