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:

  1. Use o método Distinct () da classe IEnumerable
  2. 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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top