Könnte jemand erklären, wie funktioniert Union
in LINQ?
Es wird gesagt, dass es zwei Sequenzen zusammenführt und Duplikate entfernt.
Aber kann ich das Duplizierungsentfernungsverhalten irgendwie anpassen - sagen wir, wenn ich das Element von the second sequence
im Falle eines Duplikats oder von the first sequence
verwenden möchte.
Oder auch wenn ich diese Werte irgendwie in der resultierenden Sequenz kombinieren möchte?
Wie sollte das implementiert werden?
Ich schätze, ich habe das Problem falsch beschrieben, sagen wir, wir haben einen Wert:
%Vor% und der verwendete Vergleich führt eine x.name == y.name
Prüfung durch.
Und lasst uns sagen, dass ich manchmal weiß, dass ich das Element aus der zweiten Sequenz nehmen sollte, weil es whatever
Feld ist neuer / besser als das whatever
Feld der ersten Sequenz.
Jedenfalls würde ich die sequence1.Union(sequence2)
oder sequence2.Union(sequence1)
Variation der Methoden verwenden.
Danke
Sie können second.Union(first)
anstelle von first.Union(second)
verwenden. Auf diese Weise werden die Elemente von second
und nicht die Elemente von first
beibehalten.
Wenn es sich bei den Elementen um Duplikate handelt, spielt es keine Rolle, aus welcher Liste sie stammen - außer Ihr Gleichheitsvergleich berücksichtigt natürlich nicht alle Eigenschaften des Elements.
Wenn es sich nicht wirklich um Duplikate handelt, werden beide in der resultierenden Union angezeigt.
AKTUALISIEREN
Ab Ihrer neuen Information sollten Sie einen neuen Gleichheitsoperator schreiben, der whatever
berücksichtigt. Sie können nicht einfach sequence1.Union(sequence2)
oder sequence2.Union(sequence1)
verwenden, es sei denn, alle Elemente, die von einer oder der anderen Sequenz übernommen werden sollen.
Im Extremfall müssen Sie Ihre eigene Union
Erweiterungsmethode schreiben, die dies für Sie erledigt.
Wenn das von dieser Methode zurückgegebene Objekt aufgelistet wird, führt Union die erste und zweite in dieser Reihenfolge auf und liefert jedes Element, das nicht bereits zurückgegeben wurde.
Ссылка
Die Elemente aus der jeweils als linker Parameter verwendeten Sequenz haben Vorrang vor den Elementen aus dem rechten Parameter.
Das Wichtigste dabei ist, dass es ein gut definiertes und dokumentiertes Verhalten ist und nicht nur ein Implementierungsdetail, das sich in der nächsten Version von .net ändern könnte.
Als Randnotiz bei der Implementierung von IEqualityComparer<T>
ist es wichtig, konsistente Equals
und GetHashCode
zu verwenden. Und in diesem Fall ziehe ich es vor, einen expliziten Gleichheitsvergleich an die union-Methode anzuhängen, anstatt das Equals
des Objekts selbst true
für Objekte zurückgeben zu lassen, die nicht für alle Zwecke identisch sind.