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