Wie kann ich unter Verwendung von LINQ aus einer List
eine Liste abrufen, die Einträge enthält, die mehr als einmal wiederholt werden, sowie ihre Werte?
Antworten
Zu viele Anzeigen?Dies ist ein einfacherer Weg, ohne Gruppen zu verwenden holen Sie einfach die Distrikt-Elemente und gehen Sie dann über sie und überprüfen Sie ihre Anzahl in der Liste, wenn ihre Anzahl >1 beträgt, bedeutet dies, dass es mehr als 1 Element vorhanden ist, also fügen Sie es zu Repeteditemlist hinzu
var mylist = new List() { 1, 1, 2, 3, 3, 3, 4, 4, 4 };
var distList= mylist.Distinct().ToList();
var Repeteditemlist = new List();
foreach (var item in distList)
{
if(mylist.Count(e => e == item) > 1)
{
Repeteditemlist.Add(item);
}
}
foreach (var item in Repeteditemlist)
{
Console.WriteLine(item);
}
Erwartete Ausgabe:
1 3 4
Alle GroupBy
-Antworten sind die einfachsten, aber nicht die effizientesten. Sie sind besonders schlecht für die Speicherleistung, da das Erstellen großer innerer Sammlungen Kosten verursacht.
Eine anständige Alternative ist HuBeZa's HashSet.Add
-Ansatz. Es funktioniert besser.
Wenn Ihnen Nullwerte egal sind, ist so etwas meines Wissens nach am effizientesten (sowohl in Bezug auf CPU als auch Speicher):
public static IEnumerable Duplicates(
this IEnumerable source,
Func duplicateSelector,
IEqualityComparer comparer = null)
{
comparer ??= EqualityComparer.Default;
Dictionary counts = new Dictionary(comparer);
foreach (var item in source)
{
TProperty property = duplicateSelector(item);
counts.TryGetValue(property, out int count);
switch (count)
{
case 0:
counts[property] = ++count;
break;
case 1:
counts[property] = ++count;
yield return property;
break;
}
}
}
Der Trick hier besteht darin, zusätzliche Suchkosten zu vermeiden, sobald die Anzahl der Duplikate 1 erreicht hat. Natürlich könnten Sie das Wörterbuch auch weiterhin mit der Anzahl aktualisieren, wenn Sie auch die Anzahl der Duplikatvorkommen für jedes Element möchten. Für Nullwerte benötigen Sie einfach eine zusätzliche Behandlung dafür, das ist alles.
- See previous answers
- Weitere Antworten anzeigen