Warum SequenceEqual für List<T> gibt false zurück?
Hallo ich habe einige Probleme mit sequenceEqual, wenn ich die situation so:
Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
Sentence s2 = new Sentence { Text = "Hello", Order = 2 };
List<Sentence> list1 = new List<Sentence> { s1, s2 };
List<Sentence> list2 = new List<Sentence> { s1, s2 };
und dies funktioniert sehr gut,
bool equal = list1.SequenceEqual(list2);
und zurück true
;
aber wenn ich irgendeine Methode gibt List<Sentence>
zum Beispiel:
public List<Sentence> Getall()
{
Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
Sentence s2 = new Sentence { Text = "Hello", Order = 2 };
return new List<Sentence> { s1, s2 };
}
und verwenden Sie es wie diese:
List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();
dann einfach, es zu überprüfen
bool equal = list1.SequenceEqual(list2);
gibt es 'false', bitte sagen Sie mir, warum? und wie es funktioniert?
Denn im zweiten Szenario sind Sie den verschiedenen Objekten, d.h. Ihre GetHash () - Methoden liefern unterschiedliche Werte. Im ersten Fall sind Sie exakt dieselben Objekte mit zwei unterschiedlichen Referenzen.
InformationsquelleAutor Tomasz Kowalczyk | 2013-02-19
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist, dass man
new Sentence { Text = "Hi", Order = 1 }
ist nicht gleich dem anderennew Sentence { Text = "Hi", Order = 1 }
. Obwohl die Inhalte identisch sind, Sie haben zwei Objekte, und es sei denn, Sie haben für Ihre Klasse, sonst sind Sie nicht einander gleich, es sei denn, Sie sind wortwörtlich die gleichen Objekte (wie in deinem ersten Beispiel).Ihre
Sentence
Klasse muss überschreiben dieEquals
undGetHashCode
, zumindest, an welchem Punkt IhrerSequenceEquals
sollte wieder funktionieren.Diese Antwort war knapp, aber Patryk Ćwiek, die Antwort von denen empfohlen, die Verwendung von IEqualityComparer war die Lösung für mich.
InformationsquelleAutor Rawling
Als MSDN-Staaten hier:
Sentence
in Ihrem Fall ist ein Referenz-Typ mit Standard -Equals
undGetHashCode
, das heißt, es werden über referenzielle Gleichheit für jedes element.Können Sie immer die überlast akzeptiert
, IEqualityComparer
InformationsquelleAutor Patryk Ćwiek
Erstellen Sie zwei neue Instanzen der Satz jedes mal, wenn Sie rufen
Getall()
. Beim Vergleich der Elemente in der ListeSequenceEqual
wird die Standard-Gleichheit comparer, die im Grunde nur prüfen, Sie beziehen die KMU-Objekt: Sie nicht, so Sie unterschiedlich sind.Was Sie tun können, ist, überschreiben die
Equal()
und==
- Operatoren auf Gleichheit überprüfen Sie die anderen Eigenschaften (wie Text und Reihenfolge).Alternativ können Sie eine
IEqualityComparer<Sequence>
und übergeben es anSequenceEqual
InformationsquelleAutor Tallmaris