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

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

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

 List unique = longs.Distinct().ToList(); 

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

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

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

 IEnumerable unique = longs.Distinct(); 

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

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

 IEnumerable distinctList = sourceList.DistinctBy(x => x.FooName); public static IEnumerable DistinctBy( this IEnumerable source, Func keySelector) { var knownKeys = new HashSet(); return source.Where(element => knownKeys.Add(keySelector(element))); } 

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

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

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

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

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

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

Простая интуитивная реализация `public static List RemoveDuplicates (List listPoints) {List result = new List ();

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

На месте:

  public static void DistinctValues(List 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); } } 
  • Выберите выделение, используя linq
  • вектор против списка в STL
  • Что такое List или ArrayList?
  • Строки data.frame в список
  • Java PriorityQueue с фиксированным размером
  • List
  • Сравните два списка различий
  • Доступ к определенному полю в произвольно вложенных данных JSON
  • У .NET есть способ проверить, содержит ли List a все элементы в списке b?
  • Как я могу получить ресурс «Папка» из моего файла jar?
  • Список, пройденный ref - помогите мне объяснить это поведение
  • Давайте будем гением компьютера.