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