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 ILookup
y dónde sería más eficiente en términos de velocidad del programa / memoria / acceso a datos, etc.?
Respuestas:
Dos diferencias significativas:
Lookup
Es inmutable. Yay :) (Al menos, creo que laLookup
clase concreta es inmutable, y laILookup
interfaz 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 queLookup
es 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. UnILookup
es 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
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: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: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)fuente