Estoy tratando de entender qué estructuras de datos son las más eficientes y cuándo / dónde usar cuáles.
Ahora, podría ser que simplemente no entiendo las estructuras lo suficientemente bien, pero ¿cómo es ILookup(of key, ...)diferente de a Dictionary(of key, list(of ...))?
Además, ¿dónde me gustaría usar un ILookupy dónde sería más eficiente en términos de velocidad del programa / memoria / acceso a datos, etc.?

Respuestas:
Dos diferencias significativas:
LookupEs inmutable. Yay :) (Al menos, creo que laLookupclase concreta es inmutable, y laILookupinterfaz no proporciona ningún miembro mutante. Por supuesto, podría haber otras implementaciones mutables).KeyNotFoundException. (Por lo tanto, no hayTryGetValue, AFAICR).Es probable que sean equivalentes en eficiencia: la búsqueda bien puede usar un
Dictionary<TKey, GroupingImplementation<TValue>>detrás de escena, por ejemplo. Elija entre ellos según sus requisitos. Personalmente, encuentro que la búsqueda suele ser más adecuada que aDictionary<TKey, List<TValue>>, principalmente debido a los dos primeros puntos anteriores.Tenga en cuenta que, como detalle de implementación,
IGrouping<,>cuya implementación concreta se utiliza para los implementos de valoresIList<TValue>, lo que significa que es eficiente de usarCount(),ElementAt()etc.fuente
Es interesante que nadie haya declarado la mayor diferencia real (tomada directamente de MSDN ):
fuente
Tanto a
Dictionary<Key, List<Value>>como aLookup<Key, Value>lógicamente pueden contener datos organizados de manera similar y ambos son del mismo orden de eficiencia. La principal diferencia es queLookupes inmutable: no tieneAdd()métodos ni constructor público (y, como Jon mencionó, puede consultar una clave inexistente sin excepción y tener la clave como parte de la agrupación).En cuanto a cuál usa, realmente depende de cómo quiera usarlos. Si mantiene un mapa de clave a múltiples valores que se modifica constantemente, entonces
Dictionary<Key, List<Value>>probablemente sea mejor ya que es mutable.Sin embargo, si tiene una secuencia de datos y solo desea una vista de solo lectura de los datos organizados por clave, entonces una búsqueda es muy fácil de construir y le dará una instantánea de solo lectura.
fuente
La principal diferencia entre an
ILookup<K,V>y aDictionary<K, List<V>>es que un diccionario es mutable; puede agregar o eliminar claves, y también agregar o eliminar elementos de la lista que se busca. UnILookupes inmutable y no se puede modificar una vez creado.La implementación subyacente de ambos mecanismos será la misma o similar, por lo que su velocidad de búsqueda y huella de memoria será aproximadamente la misma.
fuente
Otra diferencia que aún no se menciona es que Lookup () admite claves nulas :
fuente
Cuando la excepción no es una opción, vaya a Buscar
Si está tratando de obtener una estructura tan eficiente como una
Dictionarypero no sabe con certeza que no hay una clave duplicada en la entrada,Lookupes 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.ToDictionaryfunción:La alternativa sería escribir su propio código duplicado de administración de claves dentro de un
foreachbucle.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:Como
Lookupdebe 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)fuente