Domanda

Ho una grande elenco di valori (100-200 stringhe di caratteri) e ho bisogno di tornare un elenco distinto di loro. Qual è il modo più efficace per farlo usando .NET? I 2 modi che mi viene in mente sono:

  1. Utilizzare il metodo distinto () della classe IEnumerable
  2. Usa un dizionario

Se l'approccio Dizionario è più veloce in termini grezzi, prendere in considerazione una decisione trade-off intorno manutenibilità del codice.

È stato utile?

Soluzione

mi aspetterei di essere Enumerable.Distinct circa veloce quanto usando un dizionario, se si sta solo facendo una volta. Se si vuole essere in grado di aggiungere / rimuovere i valori e mantenere la distinta-ness, si potrebbe costruire un HashSet<string> (che è fondamentalmente ciò che mi aspetto distinto sta facendo sotto il cofano, ma Distinct() Sarà, ovviamente, ritornare nuovi valori come li trova, mantenendo ordine.

In realtà, usando solo:

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

sarà un buon (e semplice) soluzione, se non ti dispiace l'ordinamento essere incasinato. E 'più semplice rispetto all'utilizzo di un Dictionary, e concettualmente più pulito e (come non si davvero desidera mappare i tasti a valori).

(Come sempre, vorrei suggerire di trovare la soluzione più leggibile prima, e benchmark -. Se è "abbastanza veloce", quindi passare a quella Se si desidera utilizzare questo come parte di un'altra query, quindi Distinct può ben essere il modo più leggibile. In caso contrario, io suggerirei HashSet.)

Altri suggerimenti

Io personalmente andare con il metodo distinto () fornito da LINQ. E 'molto più facile da leggere e gestire. Pur utilizzando LINQ sarà più lento rispetto all'utilizzo di un dizionario la differenza sarà piccolo (nel caso che hai elencato) e si sarebbe meglio passare il tempo ottimizzazione delle query di database o le chiamate di servizio web.

Vorrei siggest di utilizzare profiling qui. Generare un elenco con gli elementi del campione, una specie che dire 1 milione di volte utilizzando entrambe le direzioni, e misurare il tempo impiegato da ciascun modo.

Se la leggibilità è un problema, creare un metodo GetDistinctItems e inserire il codice all'interno di esso:. Voilà, il codice di auto-documentato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top