Ich habe eine Liste
List<MyObject> myList
und ich füge Elemente zu einer Liste hinzu und möchte überprüfen, ob dieses Objekt bereits in der Liste enthalten ist.
also bevor ich das mache:
myList.Add(nextObject);
Ich möchte sehen, ob nextObject bereits in der Liste enthalten ist.
Das Objekt "MyObject" hat eine Reihe von Eigenschaften, aber der Vergleich basiert auf dem Abgleich zweier Eigenschaften.
Was ist der beste Weg, um eine Prüfung durchzuführen, bevor ich dieser Liste von "MyObject" ein neues "MyObject" hinzufüge?
Die einzige Lösung, die ich mir ausgedacht habe, war, von einer Liste in ein Wörterbuch zu wechseln und dann den Schlüssel zu einer verketteten Zeichenfolge der Eigenschaften zu machen (dies scheint ein wenig unelegant zu sein).
Irgendwelche anderen saubereren Lösungen, die list oder LINQ oder etwas anderes verwenden?
Verwenden Sie einfach die Contains- Methode. Beachten Sie, dass es basierend auf der Gleichheitsfunktion funktioniert
Equals
quelle
Wenn es wartbar ist, diese beiden Eigenschaften zu verwenden, können Sie:
quelle
Sind Sie sicher, dass Sie in diesem Fall eine Liste benötigen? Wenn Sie die Liste mit vielen Elementen füllen, leidet die Leistung mit
myList.Contains
odermyList.Any
; Die Laufzeit ist quadratisch. Möglicherweise möchten Sie eine bessere Datenstruktur verwenden. Beispielsweise,Sie können ein HashSet folgendermaßen verwenden:
Wenn diese Definition von Gleichheit für
MyClass
"universell" ist, müssen Sie natürlich keineIEqualityComparer
Implementierung schreiben . Sie könnten einfach überschreibenGetHashCode
undEquals
in der Klasse selbst.quelle
Ein weiterer zu erwähnender Punkt ist, dass Sie sicherstellen sollten, dass Ihre Gleichstellungsfunktion Ihren Erwartungen entspricht. Sie sollten die Methode equals überschreiben, um festzulegen, welche Eigenschaften Ihres Objekts übereinstimmen müssen, damit zwei Instanzen als gleich gelten.
Dann kannst du einfach mylist.contains (item) machen
quelle
Hier ist eine schnelle Konsolen-App, die das Konzept zur Lösung Ihres Problems darstellt.
Genießen!
quelle
Edit: Ich hatte zuerst gesagt:
Was ist an der Wörterbuchlösung unelegant? Es scheint mir vollkommen elegant zu sein, zumal Sie nur den Komparator bei der Erstellung des Wörterbuchs einstellen müssen.
Natürlich ist es unelegant, etwas als Schlüssel zu verwenden, wenn es auch der Wert ist.
Daher würde ich ein HashSet verwenden. Wenn für spätere Vorgänge eine Indizierung erforderlich ist, würde ich nach dem Hinzufügen eine Liste daraus erstellen. Andernfalls verwenden Sie einfach das Hashset.
quelle
Einfach, aber es funktioniert
oder
quelle
Wenn Sie EF Core Add verwenden
Beispiel
quelle