Quando l'eccezione non è un'opzione, andare a cercare
Se stai cercando di ottenere una struttura efficiente come un Dictionaryma 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.ToDictionaryfunzione:
// 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 Lookupdeve 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