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