178 Stimmen

Wie man doppelte Elemente aus einer Liste mit LINQ erhält?

Ich habe eine List wie diese:

List list = new List{"6","1","2","4","6","5","1"};

Ich muss die doppelten Elemente in der Liste in eine neue Liste bekommen. Derzeit verwende ich eine verschachtelte for-Schleife dafür.

Die resultierende Liste wird {"6","1"} enthalten.

Gibt es eine Idee, dies mit LINQ oder Lambda-Ausdrücken zu tun?

246voto

Lee Punkte 137913
var duplicates = lst.GroupBy(s => s)
    .SelectMany(grp => grp.Skip(1));

Bitte beachten Sie, dass dies alle Duplikate zurückgibt. Wenn Sie nur wissen möchten, welche Elemente in der Ursprungsliste dupliziert sind, können Sie Distinct auf die resultierende Sequenz anwenden oder die Lösung von Mark Byers verwenden.

181voto

Mark Byers Punkte 761508

Hier ist eine Möglichkeit, es zu tun:

List duplicates = lst.GroupBy(x => x)
                             .Where(g => g.Count() > 1)
                             .Select(g => g.Key)
                             .ToList();

Der GroupBy gruppiert die Elemente, die gleich sind, zusammen, und der Where filtert diejenigen heraus, die nur einmal erscheinen, so dass du nur die Duplikate übrig hast.

38voto

LukeH Punkte 251752

Hier ist eine weitere Option:

var list = new List { "6", "1", "2", "4", "6", "5", "1" };

var set = new HashSet();
var duplicates = list.Where(x => !set.Add(x));

26voto

Scott Langham Punkte 55597

Ich weiß, dass dies nicht die Antwort auf die ursprüngliche Frage ist, aber Sie könnten sich hier mit diesem Problem wiederfinden.

Wenn Sie alle doppelten Elemente in Ihren Ergebnissen möchten, funktioniert Folgendes.

var duplicates = list
    .GroupBy( x => x )               // Gruppierung der übereinstimmenden Elemente
    .Where( g => g.Skip(1).Any() )   // Wo die Gruppe mehr als ein Element enthält
    .SelectMany( g => g );           // Erweitern der Gruppen mit mehr als einem Element

In meiner Situation benötige ich alle Duplikate, damit ich sie in der UI als Fehler markieren kann.

19voto

Michael Punkte 3721

Ich habe diese Erweiterungsmethode basierend auf der Antwort von @Lee an den OP geschrieben. Hinweis: Es wurde ein Standardparameter verwendet (C# 4.0 erforderlich). Eine überladene Methodenaufruf in C# 3.0 würde jedoch ausreichen.

/// 
/// Methode, die alle Duplikate (distinct) in der Sammlung zurückgibt.
/// 
/// Der Typ der Sammlung.
/// Die Ausgangssammlung, um nach Duplikaten zu suchen
/// Geben Sie true an, um nur unterschiedliche Elemente zurückzugeben.
/// Eine Liste der gefundenen Duplikate in der Ausgangssammlung.
/// Dies ist eine Erweiterungsmethode für IEnumerable<T>
public static IEnumerable Duplicates
         (this IEnumerable source, bool distinct = true)
{
     if (source == null)
     {
        throw new ArgumentNullException("source");
     }

     // wählen Sie die wiederholten Elemente aus
     IEnumerable result = source.GroupBy(a => a).SelectMany(a => a.Skip(1));

     // unterschiedlich?
     if (distinct == true)
     {
        // die verzögerte Ausführung hilft uns hier
        result = result.Distinct();
     }

     return result;
}

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