Qual é a maneira mais eficiente para criar uma lista distinta de itens usando .NET?
-
19-09-2019 - |
Pergunta
Eu tenho uma grande lista de valores (100-200 cadeias de caracteres) e eu preciso para retornar uma lista distinta deles. Qual é a maneira mais eficiente de fazer isso usando .NET? Os 2 maneiras que eu posso pensar são:
- Use o método Distinct () da classe IEnumerable
- Use um dicionário
Se a abordagem dicionário é mais rápido em termos brutos, considerar um trade-off decisão em torno manutenção do código.
Solução
Eu esperaria Enumerable.Distinct
ser quase tão rápido quanto usando um dicionário, se você está fazendo isso apenas uma vez. Se você quer ser capaz de adicionar valores / Remover e manter o distinto-ness, você poderia construir um HashSet<string>
(que é basicamente o que eu espero Distinct está fazendo sob o capô, mas Distinct()
, obviamente retornar novos valores, uma vez que encontra-los, mantendo ordem.
Na verdade, usando apenas:
HashSet<string> distinctItems = new HashSet<string>(list);
será uma solução muito bom (e simples), se você não se importa a ordem a ser confuso. É mais simples do que usar um Dictionary
, e conceitualmente mais limpo também. (Como você não realmente quiser mapear chaves para valores fazem)
(Como sempre, gostaria de sugerir encontrar a solução mais legível primeiro lugar, e referência-lo -. Se é "suficientemente rápido", em seguida, ir com isso Se você quiser usar isso como parte de outra consulta, em seguida, Distinct
pode muito bem ser o forma mais legível. Caso contrário, eu sugiro HashSet
.)
Outras dicas
Eu pessoalmente ir com o método Distinct () fornecido pelo LINQ. É muito mais fácil de ler e manter. Enquanto usando LINQ será mais lento do que usar um dicionário a diferença será pequena (no caso que você listou) e você seria melhor passar o tempo otimização de consultas do banco de dados ou chamadas de serviço web.
Eu siggest você use profiling aqui. Gerar uma lista com itens de amostra, classificá-lo dizer vezes 1M, utilizando ambos os sentidos, e medir o tempo utilizado por cada caminho.
Se a legibilidade é uma preocupação, crie um método GetDistinctItems
e colocar o seu código dentro dele:. Voilà, código de auto-documentada