Каков наиболее эффективный способ создания отдельного списка элементов с использованием.NET?

У меня есть большой список значений (100-200 символьных строк), и мне нужно вернуть отдельный список из них. Каков наиболее эффективный способ сделать это с помощью.NET? 2 способа, о которых я могу думать:

  1. Используйте метод Distinct() класса IEnumerable
  2. Используй словарь

Если словарный подход быстрее в необработанных терминах, рассмотрите компромиссное решение в отношении удобства сопровождения кода.

3 ответа

Решение

Я бы ожидал Enumerable.Distinct быть примерно таким же быстрым, как использование словаря, если вы делаете это только один раз. Если вы хотите иметь возможность добавлять / удалять значения и сохранять четкость, вы можете создать HashSet<string> (что в основном то, что я ожидаю, Distinct делает под капотом, но Distinct() очевидно, будет возвращать новые значения по мере их нахождения, поддерживая порядок.

На самом деле, просто используя:

HashSet<string> distinctItems = new HashSet<string>(list);

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

(Как всегда, я бы посоветовал сначала найти наиболее читаемое решение и сравнить его - если оно "достаточно быстрое", то следуйте этому. Если вы хотите использовать это как часть другого запроса, тогда Distinct вполне может быть самый читаемый способ. В противном случае, я бы предложил HashSet.)

Я бы лично использовал метод Distinct(), предоставленный LINQ. Это намного легче читать и поддерживать. Хотя использование LINQ будет медленнее, чем использование словаря, разница будет небольшой (в случае, если вы в списке), и вам лучше будет тратить время на оптимизацию запросов к базе данных или вызовов веб-служб.

Я хотел бы, чтобы вы использовали профилирование здесь. Создайте список с образцами элементов, отсортируйте его, скажем, 1M раз, используя оба пути, и измерьте время, используемое каждым из них.

Если удобочитаемость, создайте GetDistinctItems метод и поместите свой код внутри него: вуаля, самодокументированный код.

Другие вопросы по тегам