Ho bisogno di un metodo veloce per determinare se una determinata stringa è in una lista di stringhe.Confronto stringa veloce con lista
L'elenco di stringhe non è noto fino al runtime, ma da quel momento in poi non cambierà.
potrebbe semplicemente avere un List<String>
chiamato strings
e poi fare:
if (strings.Contains(item))
Tuttavia questo si esibirà male se ci sono molte stringhe nella lista.
Potrei anche usare un HashSet<String>
, ma questo richiederebbe chiamare GetHashCode
su ogni stringa in entrata e Equals
, che sarebbe uno spreco se ci sono, ad es. solo 3 stringhe nella lista. Ho detto che questo deve essere veloce?
quando ho potuto impostazione, decidere di utilizzare un List
o una HashSet
a seconda del numero di stringhe (per esempio uso Elenco per meno di 10 corde, HashSet altrimenti), piuttosto come la logica in HybridDictionary
.
Poiché le stringhe sono unicode, una struttura Trie standard non funzionerà, anche se potrebbe esistere un albero Radix/trie Patricia. Ci sono delle buone implementazioni in C# con benchmark?
Alcuni hanno menzionato l'esclusione di GetHashCode
String
e l'utilizzo di una funzione di hash più veloce. Ci sono dei punti di riferimento là fuori?
L'utilizzo di espressioni LINQ per creare essenzialmente una dichiarazione switch ottimizzata è un nuovo approccio che sembra molto interessante.
Cos'altro potrebbe funzionare? Il costo di installazione non è importante, solo la velocità di ricerca.
Se è importante, i valori di stringa in entrata appariranno raramente nell'elenco.
Ho aggiornato la mia risposta per includere collegamenti a informazioni sui tentativi ripiegati per Unicode. –