Najszybszy sposób na usunięcie zduplikowanej wartości z listy < > przez lambda

Jaki jest najszybszy sposób na usunięcie zduplikowanych wartości z listy. Zakładam List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 }; więc jestem ciekawy w użyciu lambda do usunięcia duplikatu i zwracam: {1, 2, 3, 4, 5}. Co proponujesz?

Author: Sadaf, 2012-05-17

7 answers

Najprostszym sposobem na uzyskanie nowej listy byłoby:

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

Czy to ci wystarczy, czy musisz zmutować istniejącą listę? Ten ostatni jest znacznie bardziej długowieczny.

Zauważ, że Distinct() nie jest zagwarantowane zachowanie pierwotnego porządku, ale w obecnej implementacji będzie-i to jest najbardziej naturalna implementacja. Zobacz mój wpis na blogu Edulinq o Distinct() więcej informacji.

Jeśli nie musisz to być List<long>, możesz to po prostu zachować jako:

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

W tym momencie będzie to przejść przez de-duping za każdym razem iteracji nad unique choć. To, czy to jest dobre, czy nie, zależy od twoich wymagań.

 114
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 09:51:46

Możesz użyć tej metody rozszerzenia dla enumerabli zawierających bardziej złożone typy:

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)));
}
 75
Author: Jon Rea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-08 12:25:56

Istnieje metoda Distinct (). powinno zadziałać.

List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();
 6
Author: Pongsathon.keng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 09:19:37

Jeśli chcesz trzymać się oryginalnej listy zamiast tworzyć nową, możesz zrobić coś podobnego do tego, co wewnętrznie robi metoda rozszerzenia Distinct(), tzn. użyć HashSet, aby sprawdzić unikalność:

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

Klasa List dostarcza wygodną metodę RemoveAll(predicate), która odrzuca wszystkie elementy niespełniające warunku określonego przez predykat. Predykat jest delegatem pobierającym parametr typu elementu listy i zwracającym wartość bool. Metoda Add() HashSet zwraca true tylko jeżeli zestaw nie zawiera jeszcze elementu. Tak więc usuwając wszystkie elementy z listy, których nie można dodać do zestawu, skutecznie usuwasz wszystkie duplikaty.

 6
Author: Wormbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-27 08:55:46
List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();
 2
Author: Nikhil Agrawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 09:14:19

Prosta, intuicyjna implementacja

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
Author: Moctar Haiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 05:58:16

In-place:

    public static void DistinctValues<T>(List<T> list)
    {
        list.Sort();

        int src = 0;
        int dst = 0;
        while (src < list.Count)
        {
            var val = list[src];
            list[dst] = val;

            ++dst;
            while (++src < list.Count && list[src].Equals(val)) ;
        }
        if (dst < list.Count)
        {
            list.RemoveRange(dst, list.Count - dst);
        }
    }
 -2
Author: Const Mi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 14:53:22