Qual é a diferença entre o LINQ ToDictionary e o ToLookup? Eles parecem fazer a mesma coisa.
Qual é a diferença entre o LINQ ToDictionary e o ToLookup? Eles parecem fazer a mesma coisa.
Respostas:
Um dicionário é um mapa 1: 1 (cada chave é mapeada para um único valor) e um dicionário é mutável (editável) após o fato.
Uma pesquisa é um mapa 1: many (multi-map; cada chave é mapeada para um IEnumerable<>
dos valores com essa chave) e não há alterações na ILookup<,>
interface.
Como uma observação lateral, você pode consultar uma pesquisa (por meio do indexador) em uma chave que não existe e obterá uma sequência vazia. Faça o mesmo com um dicionário e você receberá uma exceção.
Então: quantos registros compartilham cada chave?
Uma maneira excessivamente simplificada de olhar para isso é que a Lookup<TKey,TValue>
é aproximadamente comparável a umaDictionary<TKey,IEnumerable<TValue>>
ILookup<,>
ou é uma implementação livre para lançar a KeyNotFoundException
. A implementação em Rx lança a KeyNotFoundException
.
Dictionary<TKey, IEnumerable<TValue>>
pode ser descrito como um dicionário de listas. Então, ToLookup()
é como dizer: me dar um dicionário de listas. Por alguma razão, ouvi-lo descrito dessa maneira me ajudou a entender direito minha mente.
O ToDictionary é <TKey, TValue> enquanto o ToLookup <TKey, T1, T2, T3, ...> é semelhante ao IGrouping, mas a enumeração permanece na memória.
T1, T2, T3, ...
; ToLookup e ToDictionary (os próprios métodos) têm praticamente a mesma API