He estado teniendo problemas para expresar las diferencias entre ILookup<TKey, TVal>
y IGrouping<TKey, TVal>
, y tengo curiosidad si lo entiendo correctamente ahora. LINQ complicó el problema al producir secuencias de IGrouping
elementos mientras que también me dio un método de extensión ToLookup
. Entonces sentí que eran lo mismo hasta que miré más de cerca.ILookup <TKey, TVal> vs. IGrouping <TKey, TVal>
var q1 =
from n in N
group n by n.MyKey into g
select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>
lo que equivale a:
var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>
que se parece mucho a:
var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>
Estoy en lo correcto en las siguientes analogías?
- Un
IGrouping<TKey, TVal>
es un solo grupo (es decir, una secuencia por clave), análoga aKeyValuePair<TKey, TVal>
donde el valor es en realidad una secuencia de elementos (en lugar de un solo elemento) - Un
IEnumerable<IGrouping<TKey, TVal>>
es una secuencia de los (similar a lo que se obtiene cuando se repite más de unaIDictionary<TKey, TVal>
- un
ILookup<TKey, TVal>
es más como unIDictionary<TKey, TVal>
donde el valor es en realidad una secuencia de elementos
Gracias por la respuesta. No me he encontrado pensando en Linq en términos de empujar/tirar antes. Cuando fui a Google, me encontré con uno de sus blogs, así que lo verificaré. Suena como una forma interesante de pensar sobre eso. – mckamey
Todavía pienso que estas diferencias no justifican 2 interfaces diferentes. Creo que el diseñador de la biblioteca debería haber decidido una sola interfaz.Tal vez solo un gusto personal que aquí es algo no lo suficientemente explícito. – rudimenter
¿Soy yo o hay alguna confusión con GroupBy frente a GroupJoin? Esos solo están relacionados conceptualmente. Sin embargo, es solo un error en la respuesta. – sehe