List<int>
Wie kann ich mit LINQ aus a eine Liste abrufen, die mehr als einmal wiederholte Einträge und deren Werte enthält?
quelle
List<int>
Wie kann ich mit LINQ aus a eine Liste abrufen, die mehr als einmal wiederholte Einträge und deren Werte enthält?
Der einfachste Weg, um das Problem zu lösen, besteht darin, die Elemente anhand ihres Werts zu gruppieren und dann einen Vertreter der Gruppe auszuwählen, wenn die Gruppe mehr als ein Element enthält. In LINQ bedeutet dies:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
Wenn Sie wissen möchten, wie oft die Elemente wiederholt werden, können Sie Folgendes verwenden:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
Dies gibt List
einen anonymen Typ zurück, und jedes Element verfügt über die Eigenschaften Element
und Counter
, um die benötigten Informationen abzurufen.
Und wenn es sich um ein Wörterbuch handelt, das Sie suchen, können Sie es verwenden
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
Dies gibt ein Wörterbuch mit Ihrem Element als Schlüssel und der Häufigkeit zurück, mit der es als Wert wiederholt wird.
code
for (int i = 0; i <duplicates.Count; i ++) {int duplicate = duplicates [i]; duplicatesLocation.Add (duplizieren, neue Liste <int> ()); für (int k = 0; k <HitsList.Length; k ++) {if (HitsList [k]. Enthält (Duplikat)) {DuplikateLocation.ElementAt (i) .Value.Add (k); }} // entferne Duplikate nach einigen Regeln. }code
Finden Sie heraus, ob eine Aufzählung ein Duplikat enthält :
Finden Sie heraus, ob alle Werte in einer Aufzählung eindeutig sind :
quelle
Ein anderer Weg ist
HashSet
:Wenn Sie eindeutige Werte in Ihrer Duplikatliste haben möchten:
Hier ist die gleiche Lösung wie bei einer generischen Erweiterungsmethode:
quelle
List<int> { 1, 2, 3, 4, 5, 2 }
als Quelle ist das Ergebnis einIEnumerable<int>
Element mit dem Wert1
(wobei der korrekte doppelte Wert 2 ist)Console.WriteLine("Count: {0}", duplicates.Count());
direkt darunter hinzugefügt und sie wird gedruckt6
. Sofern mir nichts über die Anforderungen für diese Funktion fehlt, sollte die resultierende Sammlung nur 1 Element enthalten.ToList
, um das Problem zu beheben, aber es bedeutet, dass die Methode ausgeführt wird, sobald sie aufgerufen wird, und nicht, wenn Sie die Ergebnisse durchlaufen.var hash = new HashSet<int>();
var duplicates = list.Where(i => !hash.Add(i));
führt zu einer Liste, die alle Vorkommen von Duplikaten enthält. Wenn Sie also vier Vorkommen von 2 in Ihrer Liste haben, enthält Ihre doppelte Liste drei Vorkommen von 2, da nur eine der 2 zum HashSet hinzugefügt werden kann. Wenn Sie möchten, dass Ihre Liste eindeutige Werte für jedes Duplikat enthält, verwenden Sie stattdessen diesen Code:var duplicates = mylist.Where(item => !myhash.Add(item)).ToList().Distinct().ToList();
Du kannst das:
Mit diesen Erweiterungsmethoden:
Die Verwendung von IsMultiple () in der Duplicates-Methode ist schneller als Count (), da hierdurch nicht die gesamte Auflistung iteriert wird.
quelle
Count()
ist vorbestellt berechnet und Ihre Lösung ist wahrscheinlich langsamer.Count()
] unterscheidet sich also grundlegend vom Iterieren der gesamten Liste.Count()
ist vorberechnet, die gesamte Liste jedoch nicht.Ich habe eine Erweiterung erstellt, um darauf zu antworten, dass Sie sie in Ihre Projekte aufnehmen können. Ich denke, dies ist der häufigste Fall, wenn Sie in List oder Linq nach Duplikaten suchen.
Beispiel:
quelle
So finden Sie nur die doppelten Werte:
Z.B. var list = new [] {1,2,3,1,4,2};
Gruppieren nach gruppiert also die Zahlen nach ihren Schlüsseln und behält die Anzahl (Anzahl der Wiederholungen) bei. Danach überprüfen wir nur die Werte, die sich mehr als einmal wiederholt haben.
So finden Sie nur die eindeutigen Werte:
Z.B. var list = new [] {1,2,3,1,4,2};
Gruppieren nach gruppiert also die Zahlen nach ihren Schlüsseln und behält die Anzahl (Anzahl der Wiederholungen) bei. Danach überprüfen wir nur noch, ob die Werte, die sich nur einmal wiederholt haben, eindeutig sind.
quelle
var unique = list.Distinct(x => x)
Vollständiger Satz von Linq to SQL-Erweiterungen von Duplikatfunktionen, die in MS SQL Server überprüft wurden. Ohne Verwendung von .ToList () oder IEnumerable. Diese Abfragen werden in SQL Server und nicht im Speicher ausgeführt. . Die Ergebnisse werden nur im Speicher zurückgegeben.
quelle
Es gibt eine Antwort, aber ich habe nicht verstanden, warum es nicht funktioniert.
Meine Lösung ist in dieser Situation so.
quelle