Ответ 1
Существует большая разница между этими двумя подходами:
List<int> Result1 = new HashSet<int>(myList).ToList(); //3700 ticks
List<int> Result2 = myList.Distinct().ToList(); //4700 ticks
Первый может (возможно,) изменить порядок элементов возвращаемых элементов List<>
: Result1
не будет в том же порядке, что и myList
. Второй сохраняет исходный порядок.
Вероятно, нет более быстрого способа, чем первый.
Вероятно, нет более "правильных" (для определенного определения "правильный", основанный на упорядочении), чем второй.
(третий похож на второй, только медленнее)
Просто из любопытства, Distinct()
:
// Reference source http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,712
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
return DistinctIterator<TSource>(source, null);
}
// Reference source http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,722
static IEnumerable<TSource> DistinctIterator<TSource>(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer) {
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in source)
if (set.Add(element)) yield return element;
}
Итак, в конце Distinct()
просто используется внутренняя реализация HashSet<>
(называемая Set<>
) для проверки уникальности элементов.
Для полноты я добавлю ссылку на вопрос Не сохраняет ли метод С# Distinct() первоначальный порядок последовательности?