¿Cuál es la diferencia entre LINQ ToDictionary y ToLookup? Parecen hacer lo mismo.
123
Un diccionario es un mapa 1: 1 (cada clave está asignada a un solo valor), y un diccionario es mutable (editable) después del hecho.
Una búsqueda es un 1: muchos mapas (mapa múltiple; cada clave se asigna a uno IEnumerable<>
de los valores con esa clave), y no hay mutación en la ILookup<,>
interfaz.
Como nota al margen, puede consultar una búsqueda (a través del indexador) en una clave que no existe, y obtendrá una secuencia vacía. Haga lo mismo con un diccionario y obtendrá una excepción.
Entonces: ¿cuántos registros comparten cada clave?
Una forma demasiado simplificada de verlo es que a Lookup<TKey,TValue>
es más o menos comparable a unDictionary<TKey,IEnumerable<TValue>>
ILookup<,>
o es una implementación libre de lanzar aKeyNotFoundException
. La implementación en Rx arroja aKeyNotFoundException
.Dictionary<TKey, IEnumerable<TValue>>
podría describirse como un diccionario de listas. EntoncesToLookup()
es como decir: dame un diccionario de listas. Por alguna razón, escucharlo descrito de esa manera me ayudó a entenderlo.ToDictionary es <TKey, TValue> mientras ToLookup <TKey, T1, T2, T3, ...> es similar a IGrouping pero la enumeración permanece en la memoria.
fuente
T1, T2, T3, ...
; ToLookup y ToDictionary (los métodos mismos) tienen prácticamente la misma API