Подтвердить что ты не робот

Самый быстрый способ удалить повторяющееся значение из списка <> лямбдой

что является самым быстрым способом удаления повторяющихся значений из списка. Предположим List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 }; Поэтому мне интересно использовать lambda для удаления дубликата и возврата: {1, 2, 3, 4, 5}. Каково ваше предложение?

4b9b3361

Ответ 1

Самый простой способ получить новый список:

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

Насколько это достаточно для вас, или вам нужно изменить существующий список? Последнее значительно более длинное.

Обратите внимание, что Distinct() не гарантирует сохранение первоначального заказа, но в текущей реализации он будет - и это самая естественная реализация. Дополнительную информацию см. В блоге Edulinq о Distinct().

Если вам не нужно быть List<long>, вы можете просто сохранить его как:

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

В этот момент он будет проходить через обнуление каждый раз, когда вы перебираете unique. Будет ли это хорошо или не будет зависеть от ваших требований.

Ответ 2

Вы можете использовать этот метод расширения для перечислений, содержащих более сложные типы:

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)));
}

Ответ 3

Существует метод Distinct(). он должен работать.

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

Ответ 4

Если вы хотите использовать оригинальный список вместо создания нового, вы можете что-то подобное тому, что делает внутренний метод расширения Distinct(), т.е. использовать HashSet для проверки уникальности:

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

Класс List предоставляет этот удобный метод RemoveAll(predicate), который удаляет все элементы, не удовлетворяющие условию, указанному предикатом. Предикат - это делегат, принимающий параметр типа элемента списка и возвращающий значение bool. Метод HashSet Add() возвращает true, только если набор еще не содержит элемент. Таким образом, удаляя любые элементы из списка, которые нельзя добавить в набор, вы удаляете все дубликаты.

Ответ 5

List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();

Ответ 6

В месте

    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);
        }
    }