C # linq Gewerkschaftsfrage

8

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?

Aktualisieren

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

    
Yippie-Ki-Yay 11.12.2010, 23:23
quelle

3 Antworten

12

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.

    
Thomas Levesque 11.12.2010, 23:30
quelle
5

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.

    
ChrisF 11.12.2010 23:28
quelle
5
  

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.

    
CodesInChaos 11.12.2010 23:43
quelle

Tags und Links