ILookup <TKey, TVal> vs. IGrouping <TKey, TVal>

Eu tenho tido problemas para articular as diferenças entreILookup<TKey, TVal> eIGrouping<TKey, TVal>e estou curioso se entendi corretamente agora. O LINQ agravou a questão produzindo sequências deIGrouping itens, enquanto também me dando umToLookup método de extensão. Então parecia que eles eram os mesmos até que eu olhei mais de perto.

var q1 = 
    from n in N
    group n by n.MyKey into g
    select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>

Qual é equivalente a:

var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>

Que parece muito com:

var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>

Estou correto nas seguintes analogias?

AIGrouping<TKey, TVal> é um grupo único (isto é, uma sequência codificada), análogo aKeyValuePair<TKey, TVal> onde o valor é, na verdade, uma sequência de elementos (em vez de um único elemento)AIEnumerable<IGrouping<TKey, TVal>> é uma seqüência dessas (semelhante ao que você obtém ao iterar sobre umIDictionary<TKey, TVal>AILookup<TKey, TVal> é mais como umIDictionary<TKey, TVal> onde o valor é na verdade uma sequência de elementos

questionAnswers(3)

yourAnswerToTheQuestion