Получение отдельных и упорядоченных членов из списка строк - linq или hashset для уникального, какой из них быстрее/лучше подходит

У меня есть большой список строк (около 5-20 тысяч записей), которые мне нужно заказать, а также удалить дубликаты.

Я сделал это двумя способами: один раз с помощью хеш-набора и один раз исключительно с помощью linq. Тесты с таким количеством записей не показали большой разницы, но мне интересно, какой способ и, следовательно, какой метод будет лучше подходить.

Для способов (myList имеет тип данных List):

Linq: я использую 1 оператор linq, чтобы упорядочить список и получить из него различные значения.

myList = myList.OrderBy(q => q).Distinct().ToList();

Hashset: я использую hashset для удаления всех дубликатов, а затем упорядочиваю список

myList = new HashSet<String>(myList).ToList<String>();
myList = myList.OrderBy(q => q).ToList();

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


person Thomas    schedule 21.08.2014    source источник
comment
Тесты с таким количеством записей не показали большой разницы — ожидаете ли вы (значительно) другое количество записей в обозримом будущем? Что бы это ни стоило, я думаю, что оператор Linq выглядит более читаемым. Может сначала Distinct(), потом OrderBy().   -  person Corak    schedule 21.08.2014
comment
Я рассчитываю примерно в 10 раз больше моих текущих чисел как полный максимум. то же самое здесь для оператора linq, который лучше читается.   -  person Thomas    schedule 21.08.2014
comment
Можете ли вы экстраполировать свои тестовые данные, например, добавив от "1" до "9" в начале (или конце) каждой строки?   -  person Corak    schedule 21.08.2014
comment
Как насчет использования SortedSet<String>, он уникален и отсортирован по умолчанию? – См. DEMO. - Я не знаю, быстрее ли это, чем сортировка после добавления элементов, но, возможно, вы могли бы добавить это в свои тесты и проверить.   -  person Nope    schedule 21.08.2014
comment
@FrançoisWahl, кажется, имеет относительно аналогичную производительность (аналогичные изменения во времени)   -  person Thomas    schedule 21.08.2014
comment
@Thomas: Если все они работают одинаково / одинаково, выбор может быть больше основан на использовании правильного типа для правильной работы. Если SortedSet<string> делает то, что вам нужно, это может быть хорошим выбором вместо использования LINQ сверху?   -  person Nope    schedule 21.08.2014


Ответы (2)


Если вас действительно волнует каждая наносекунда, то

myList = myList.Distinct().OrderBy(q => q).ToList();

может быть немного быстрее, чем:

myList = myList.OrderBy(q => q).Distinct().ToList();

если имеется большое количество дубликатов.

Метод LINQ более удобочитаем и будет иметь производительность, аналогичную явному созданию HashSet<T>, как говорили другие. На самом деле это может быть немного быстрее, если исходный список уже отсортирован, поскольку метод LINQ сохранит исходный порядок перед сортировкой, в то время как явное создание HashSet<T> будет перечислять в неопределенном порядке.

person Joe    schedule 21.08.2014

Они почти одинаковы. Distinct также использует Set<T> для устранения дубликатов. Я предлагаю сначала использовать Distinct, а затем сортировать свои предметы. Также во втором коде вызов ToList<String> является избыточным, вы можете использовать OrderBy на HashSet, а затем вызвать ToList.

person Selman Genç    schedule 21.08.2014
comment
Хороший момент там Tnx. Таким образом, на самом деле не имеет значения, какой метод из двух использовать, так как оба работают одинаково (в моих тестах у меня есть сильная дисперсия для каждой попытки, независимо от используемого метода, это может занять 1,4-2,3 секунды, что сделало почти невозможным определить, если один из двух на самом деле быстрее или нет). - person Thomas; 21.08.2014