643 Stimmen

Duplikate aus einer List<T> in C# entfernen

Jeder haben eine schnelle Methode für de-Duplizierung eine generische Liste in C#?

5 Stimmen

Ist Ihnen die Reihenfolge der Elemente im Ergebnis wichtig? Dies wird einige Lösungen ausschließen.

3 Stimmen

Eine Ein-Zeilen-Lösung: ICollection<MyClass> withoutDuplicates = new HashSet<MyClass>(inputList);

0 Stimmen

Wo würde diese Methode angewendet werden?

12voto

Tom Hawtin - tackline Punkte 142461

In Java (ich nehme an, C# ist mehr oder weniger identisch):

list = new ArrayList<T>(new HashSet<T>(list))

Wenn Sie die ursprüngliche Liste wirklich abändern wollten:

List<T> noDupes = new ArrayList<T>(new HashSet<T>(list));
list.clear();
list.addAll(noDupes);

Um die Reihenfolge beizubehalten, ersetzen Sie einfach HashSet durch LinkedHashSet.

5 Stimmen

In C# wäre es: List<T> noDupes = new List<T>(new HashSet<T>(list)); list.Clear(); list.AddRange(noDupes);

0 Stimmen

In C# ist es auf diese Weise einfacher: var noDupes = new HashSet<T>(list); list.Clear(); list.AddRange(noDupes); :)

9voto

WonderWorker Punkte 7910

Verwenden Sie Linqs Gewerkschaft Methode.

Hinweis: Diese Lösung setzt keine Kenntnisse über Linq voraus, abgesehen davon, dass sie existiert.

Code

Fügen Sie zunächst am Anfang Ihrer Klassendatei Folgendes hinzu:

using System.Linq;

Jetzt können Sie folgendes verwenden, um Duplikate aus einem Objekt namens zu entfernen, obj1 :

obj1 = obj1.Union(obj1).ToList();

Hinweis: Umbenennen obj1 auf den Namen Ihres Objekts.

Wie es funktioniert

  1. Der Befehl Union listet je einen Eintrag von zwei Quellobjekten auf. Da es sich bei obj1 um beide Quellobjekte handelt, wird obj1 auf einen der beiden Einträge reduziert.

  2. El ToList() gibt eine neue Liste zurück. Dies ist notwendig, weil Linq-Befehle wie Union gibt das Ergebnis als IEnumerable-Ergebnis zurück, anstatt die ursprüngliche Liste zu ändern oder eine neue Liste zurückzugeben.

8voto

Grant Punkte 994

Als Hilfsmethode (ohne Linq):

public static List<T> Distinct<T>(this List<T> list)
{
    return (new HashSet<T>(list)).ToList();
}

0 Stimmen

Ich glaube, Distinct ist schon vergeben. Abgesehen davon (wenn Sie die Methode umbenennen) sollte es funktionieren.

7voto

dush88c Punkte 1614

Installation der MehrLINQ Paket über Nuget können Sie die Objektliste leicht durch eine Eigenschaft unterscheiden

IEnumerable<Catalogue> distinctCatalogues = catalogues.DistinctBy(c => c.CatalogueCode);

7voto

gary Punkte 509

Hier ist eine Erweiterungsmethode zum Entfernen benachbarter Duplikate in-situ. Rufen Sie zuerst Sort() auf und übergeben Sie denselben IComparer. Dies sollte effizienter sein als die Version von Lasse V. Karlsen, die RemoveAt wiederholt aufruft (was zu mehreren Blockspeicherbewegungen führt).

public static void RemoveAdjacentDuplicates<T>(this List<T> List, IComparer<T> Comparer)
{
    int NumUnique = 0;
    for (int i = 0; i < List.Count; i++)
        if ((i == 0) || (Comparer.Compare(List[NumUnique - 1], List[i]) != 0))
            List[NumUnique++] = List[i];
    List.RemoveRange(NumUnique, List.Count - NumUnique);
}

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