Каков наиболее эффективный способ создания отдельного списка элементов с помощью .NET?
-
19-09-2019 - |
Вопрос
У меня есть большой список значений (100–200 строк символов), и мне нужно вернуть их отдельный список.Каков наиболее эффективный способ сделать это с помощью .NET?Я могу придумать два способа:
- Используйте метод Distinct() класса IEnumerable.
- Используй словарь
Если словарный подход быстрее в исходном выражении, рассмотрите компромиссное решение в отношении удобства сопровождения кода.
Решение
я бы ожидал Enumerable.Distinct
быть примерно таким же быстрым, как использование словаря, если вы делаете это только один раз.Если вы хотите иметь возможность добавлять/удалять значения и сохранять различимость, вы можете создать HashSet<string>
(по сути, это именно то, что, как я ожидаю, делает Distinct под капотом, но Distinct()
очевидно, будет возвращать новые значения по мере их обнаружения, сохраняя порядок.
Фактически, просто используя:
HashSet<string> distinctItems = new HashSet<string>(list);
будет довольно хорошим (и простым) решением, если вы не возражаете против того, чтобы порядок был испорчен.Это проще, чем использовать Dictionary
, а также концептуально чище (поскольку вы не Действительно хотите сопоставить ключи со значениями).
(Как всегда, я бы посоветовал сначала найти наиболее читабельное решение и протестировать его - если оно «достаточно быстрое», то используйте его.Если вы хотите использовать это как часть другого запроса, то Distinct
вполне может быть наиболее читаемым способом.В противном случае я бы предложил HashSet
.)
Другие советы
Лично я бы использовал метод Distinct(), предоставляемый LINQ.Его гораздо проще читать и поддерживать.Хотя использование LINQ будет медленнее, чем использование словаря, разница будет небольшой (в случае, который вы указали), и вам лучше потратить время на оптимизацию запросов к базе данных или вызовов веб-служб.
Я бы посоветовал вам использовать здесь профилирование.Создайте список с примерами элементов, отсортируйте его, скажем, 1 миллион раз, используя оба способа, и измерьте время, затраченное каждым способом.
Если читаемость вызывает беспокойство, создайте GetDistinctItems
метод и поместите в него свой код:вуаля, самодокументированный код.