wake-up-neo.net

Schnellste Methode zum Entfernen doppelter Werte aus einer Liste <> mit Lambda

was ist der schnellste Weg, um doppelte Werte aus einer Liste zu entfernen. Annehmen List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 }; Ich bin also daran interessiert, Lambda zu verwenden, um Duplikate zu entfernen und zurückzusenden: {1, 2, 3, 4, 5}. Was ist dein Vorschlag?

68
Saeid

Der einfachste Weg, eine neue Liste zu erhalten, wäre:

List<long> unique = longs.Distinct().ToList();

Ist das gut genug für Sie oder müssen Sie die vorhandene Liste ändern? Letzteres ist deutlich langatmiger.

Beachten Sie, dass Distinct() nicht garantiert ist , um die ursprüngliche Reihenfolge beizubehalten, aber in der aktuellen Implementierung wird - und das ist die natürlichste Implementierung . Weitere Informationen finden Sie in meinem Edulinq-Blogpost über Distinct() .

Wenn Sie es nicht als List<long> Benötigen, können Sie es einfach wie folgt aufbewahren:

IEnumerable<long> unique = longs.Distinct();

An diesem Punkt durchläuft es die Deduplizierung jedes Mal, wenn Sie über unique iterieren. Ob das gut ist oder nicht, hängt von Ihren Anforderungen ab.

123
Jon Skeet

Sie können diese Erweiterungsmethode für Enumerables verwenden, die komplexere Typen enthalten:

IEnumerable<Foo> distinctList = sourceList.DistinctBy(x => x.FooName);

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector)
{
    var knownKeys = new HashSet<TKey>();
    return source.Where(element => knownKeys.Add(keySelector(element)));
}
78
Jon Rea

Es gibt die Methode Distinct (). es sollte funktionieren.

List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();
7
Pongsathon.keng

Wenn Sie an der ursprünglichen Liste festhalten möchten, anstatt eine neue zu erstellen, können Sie eine ähnliche Funktion wie die Erweiterungsmethode Distinct() verwenden, um die Eindeutigkeit zu überprüfen:

HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));

Die List-Klasse bietet diese praktische RemoveAll(predicate) -Methode, mit der alle Elemente gelöscht werden, die die vom Prädikat angegebene Bedingung nicht erfüllen. Das Prädikat ist ein Delegat, der einen Parameter des Elementtyps der Liste verwendet und einen bool-Wert zurückgibt. Die Add() -Methode von HashSet gibt nur dann true zurück, wenn die Menge das Element noch nicht enthält. Wenn Sie also Elemente aus der Liste entfernen, die nicht zum Set hinzugefügt werden können, werden alle Duplikate effektiv entfernt.

6
Wormbo
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
2
Nikhil Agrawal

Eine einfache intuitive Implementierung

public static List<PointF> RemoveDuplicates(List<PointF> listPoints)
{
    List<PointF> result = new List<PointF>();

    for (int i = 0; i < listPoints.Count; i++)
    {
        if (!result.Contains(listPoints[i]))
            result.Add(listPoints[i]);
    }

    return result;
}
1
Moctar Haiz