Qual é a diferença entre LINQ ToDictionary e ToLookup

123

Qual é a diferença entre o LINQ ToDictionary e o ToLookup? Eles parecem fazer a mesma coisa.

Carlo V. Dango
fonte

Respostas:

176

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

Marc Gravell
fonte
5
Também um pouco semelhante a um groupby?
Carlo V. Dango
7
É o comportamento de uma pesquisa retornando uma sequência vazia para uma parte chave ausente do contrato padrão ILookup<,>ou é uma implementação livre para lançar a KeyNotFoundException. A implementação em Rx lança a KeyNotFoundException.
Lukazoid
Caso ajude alguém: 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.
Nate Cook
-4

O ToDictionary é <TKey, TValue> enquanto o ToLookup <TKey, T1, T2, T3, ...> é semelhante ao IGrouping, mas a enumeração permanece na memória.

Bonshington
fonte
3
Não tenho muita certeza do que você está tentando ilustrar com o T1, T2, T3, ...; ToLookup e ToDictionary (os próprios métodos) têm praticamente a mesma API
Marc Gravell