Каков наиболее эффективный способ создания отдельного списка элементов с использованием .NET? - PullRequest
1 голос
/ 13 ноября 2009

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

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

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

Ответы [ 3 ]

7 голосов
/ 13 ноября 2009

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

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

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

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

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

2 голосов
/ 13 ноября 2009

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

1 голос
/ 13 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...