¿Cuál es la diferencia entre LINQ ToDictionary y ToLookup?

123

¿Cuál es la diferencia entre LINQ ToDictionary y ToLookup? Parecen hacer lo mismo.

Carlo V. Dango
fuente

Respuestas:

176

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>>

Marc Gravell
fuente
55
También algo similar a un groupby?
Carlo V. Dango
77
Es el comportamiento de una búsqueda que devuelve una secuencia vacía para una parte clave faltante del contrato estándar ILookup<,>o es una implementación libre de lanzar a KeyNotFoundException. La implementación en Rx arroja a KeyNotFoundException.
Lukazoid
En caso de que ayude a alguien: Dictionary<TKey, IEnumerable<TValue>>podría describirse como un diccionario de listas. Entonces ToLookup()es como decir: dame un diccionario de listas. Por alguna razón, escucharlo descrito de esa manera me ayudó a entenderlo.
Nate Cook
-4

ToDictionary es <TKey, TValue> mientras ToLookup <TKey, T1, T2, T3, ...> es similar a IGrouping pero la enumeración permanece en la memoria.

Bonshington
fuente
3
No estoy muy seguro de lo que está tratando de ilustrar con el T1, T2, T3, ...; ToLookup y ToDictionary (los métodos mismos) tienen prácticamente la misma API
Marc Gravell