¿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