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



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

581   7  

7 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

простая интуитивная реализация

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

на месте:

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

Comments

    Ничего не найдено.