Ich habe eine Klasse Items
mit properties (Id, Name, Code, Price)
.
Die Liste von Items
wird mit doppelten Elementen gefüllt.
Zum Beispiel:
1 Item1 IT00001 $100
2 Item2 IT00002 $200
3 Item3 IT00003 $150
1 Item1 IT00001 $100
3 Item3 IT00003 $150
Wie entferne ich die Duplikate in der Liste mit linq?
c#
linq
linq-to-objects
generic-list
Prasad
quelle
quelle
var set = new HashSet<int>(); var uniques = items.Where(x => set.Add(x.Id));
. Es sollte kriminell sein, dies zu tun.Antworten:
Erstellen Sie einen benutzerdefinierten Gleichheitsvergleicher, um nur einige der Eigenschaften abzugleichen, z.
Dann benutze es so:
quelle
GroupBy
was nicht möglich war.XoR
Operator^
in C # zu untersuchen. Hatte in VB.NET über verwendetXor
, musste aber Ihren Code zweimal überprüfen, um zu sehen, was er zuerst war.1[DataAccess.HR.Dao.CCS_LOCATION_TBL] Distinct[CCS_LOCATION_TBL](System.Linq.IQueryable
1 [DataAccess.HR.Dao.CCS_LOCATION_TBL], System.Collections.Generic.IEqualityComparer`1 [nicht DataAccess.HR.Dao.CCS_LOCATION_TBL]) 'Methode, und diese Methode kann nicht in einen Geschäftsausdruck übersetzt werden.quelle
Wenn Ihre Distinct-Abfrage durch etwas ausgelöst wird , sollten Sie sich MoreLinq ansehen , den DistinctBy-Operator verwenden und verschiedene Objekte anhand ihrer ID auswählen.
quelle
So konnte ich mich mit Linq gruppieren. Ich hoffe es hilft.
quelle
FirstOrDefault
, bietet die Verwendung hier keinen Vorteil, wenn dasSelect
Unmittelbare folgtGroupBy
, da es keine Möglichkeit gibt, dass es eine leere Gruppe gibt (die Gruppen wurden nur aus dem Inhalt der Sammlung abgeleitet )Verwenden Sie,
Distinct()
aber denken Sie daran, dass der Standard-Gleichheitsvergleicher zum Vergleichen von Werten verwendet wird. Wenn Sie also etwas darüber hinaus möchten, müssen Sie Ihren eigenen Vergleicher implementieren.Ein Beispiel finden Sie unter http://msdn.microsoft.com/en-us/library/bb348436.aspx .
quelle
Sie haben hier drei Möglichkeiten, um doppelte Elemente in Ihrer Liste zu entfernen:
Distinct(new DistinctItemComparer())
wie @Christian Hayter erwähnt.Verwenden Sie
GroupBy
, aber bitte beachtenGroupBy
Sie , dass Sie nach allen Spalten gruppieren solltenId
, da doppelte Elemente nicht immer entfernt werden, wenn Sie nur danach gruppieren . Betrachten Sie zum Beispiel das folgende Beispiel:Das Ergebnis für diese Gruppierung ist:
Was falsch ist, weil es
{Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
als doppelt betrachtet wird. Die richtige Abfrage wäre also:3.Überschreiben
Equal
undGetHashCode
in Artikelklasse :Dann können Sie es so verwenden:
quelle
Eine universelle Erweiterungsmethode:
Anwendungsbeispiel:
quelle
Probieren Sie diese Erweiterungsmethode aus. Hoffentlich könnte das helfen.
Verwendungszweck:
quelle
quelle
Eine weitere Problemumgehung, nicht schön kaufen praktikabel.
Ich habe eine XML-Datei mit einem Element namens "MEMDES" mit zwei Attributen als "GRADE" und "SPD", um die RAM-Modulinformationen aufzuzeichnen. Es gibt viele doppelte Gegenstände in der SPD.
Hier ist der Code, mit dem ich die doppelten Elemente entferne:
quelle
Wenn Sie IEqualityComparer nicht schreiben möchten, können Sie Folgendes versuchen.
quelle