Cuando la excepción no es una opción, vaya a Buscar
Si está tratando de obtener una estructura tan eficiente como una Dictionary
pero no sabe con certeza que no hay una clave duplicada en la entrada, Lookup
es más seguro.
Como se menciona en otra respuesta, también admite claves nulas, y siempre devuelve un resultado válido cuando se consulta con datos arbitrarios, por lo que parece más resistente a la entrada desconocida (menos propenso que el Diccionario para generar excepciones).
Y es especialmente cierto si lo compara con la System.Linq.Enumerable.ToDictionary
función:
// 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);
La alternativa sería escribir su propio código duplicado de administración de claves dentro de un foreach
bucle.
Consideraciones de rendimiento, Diccionario: un claro ganador
Si no necesita una lista y va a administrar una gran cantidad de elementos, Dictionary
(o incluso su propia estructura personalizada) sería más eficiente:
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);
// ...
Como Lookup
debe mantener una lista de elementos para cada tecla, es más lenta que Dictionary (alrededor de 3 veces más lenta para una gran cantidad de elementos)
Velocidad de búsqueda: Creación: 00: 00: 01.5760444
Velocidad del diccionario: Creación: 00: 00: 00.4418833