Quando l'eccezione non è un'opzione, andare a cercare
Se stai cercando di ottenere una struttura efficiente come un Dictionary
ma non sai con certezza che non ci sono chiavi duplicate in input, Lookup
è più sicuro.
Come menzionato in un'altra risposta, supporta anche le chiavi null e restituisce sempre un risultato valido quando viene eseguita una query con dati arbitrari, quindi appare più resistente all'input sconosciuto (meno incline del dizionario per sollevare eccezioni).
Ed è particolarmente vero se lo confronti con la System.Linq.Enumerable.ToDictionary
funzione:
// won't throw
new[] { 1, 1 }.ToLookup(x => x);
// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);
L'alternativa sarebbe quella di scrivere il proprio codice duplicato di gestione delle chiavi all'interno di a foreach
ciclo.
Considerazioni sulle prestazioni, Dizionario: un chiaro vincitore
Se non hai bisogno di un elenco e gestirai un numero enorme di elementi Dictionary
(o anche la tua struttura personalizzata personalizzata) sarebbe più efficiente:
Stopwatch stopwatch = new Stopwatch();
var list = new List<string>();
for (int i = 0; i < 5000000; ++i)
{
list.Add(i.ToString());
}
stopwatch.Start();
var lookup = list.ToLookup(x => x);
stopwatch.Stop();
Console.WriteLine("Creation: " + stopwatch.Elapsed);
// ... Same but for ToDictionary
var lookup = list.ToDictionary(x => x);
// ...
Come Lookup
deve mantenere un elenco di elementi per ogni tasto, è più lento del Dizionario (circa 3 volte più lento per un numero enorme di elementi)
Velocità di ricerca: Creazione: 00: 00: 01.5760444
Velocità del dizionario: Creazione: 00: 00: 00.4418833