546 Stimmen

C# LINQ Duplikate in Liste finden

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?

1voto

Mohamed Fathallah Punkte 188

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

0voto

nawfal Punkte 65966

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.

-2voto

John Punkte 963

Duplikate nach Schlüssel entfernen

myTupleList = myTupleList.GroupBy(tuple => tuple.Item1).Select(group => group.First()).ToList();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X