2009-08-26 14 views
63

ILookup<TKey, TVal>IGrouping<TKey, TVal>の違いを明確にするのに問題がありましたが、今正しく理解していれば不思議です。 LINQはIGroupingアイテムのシーケンスを生成することで問題を複雑化し、またToLookup拡張メソッドを与えました。それで、私がもっと綿密に見えるまで、彼らは同じように感じました。以下のようにたくさん見えるどのILookup <TKey, TVal>とIGrouping <TKey, TVal>

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

:と同等です

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

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

私は、次のアナロジーで修正アム?

  1. IGrouping<TKey, TVal>値が実際の要素の配列(よりむしろ単一の要素)であるKeyValuePair<TKey, TVal>に類似する単一のグループ(すなわち、キー順)、
  2. IEnumerable<IGrouping<TKey, TVal>>は同様のもののシーケンス(ですIDictionary<TKey, TVal>
  3. を繰り返し処理するとき何を得るにILookup<TKey, TVal>は、より多くの値が実際の要素

答えて

63

はい、それらのすべてがcorrecあるのシーケンスであるIDictionary<TKey, TVal>のようなものですt。

ILookup<TKey, TValue>IEnumerable<IGrouping<TKey, TValue>>に拡張されているので、特定のキーを検索するだけでなく、(または)代わりにすべてのキー/コレクションのペアを反復処理できます。

ILookup<TKey,TValue>とは基本的にはIDictionary<TKey, IEnumerable<TValue>>と考えています。

ToLookupは "今すぐ"の操作(即時実行)であり、GroupByは遅延されていることに注意してください。それが起こると、 "LINQをプルする"方法で、GroupByの結果からIGroupingを引き出すと、(途中でグループを切り替えることができないため)すべてのデータを読み込む必要がありますが、他の実装ではストリーミング結果を生成することができます。 (Push LINQでは、LINQ to Eventsが同じであると期待しています)。

+0

ありがとうございます。私は前にプッシュ/プルの点でLinqを考えていない。私がGoogleに行ったとき、私はあなたのブログの1つに出くわしたので、それをチェックします。興味深い考え方のように思えます。 – mckamey

+0

私はまだこれらの違いが2つの異なるインターフェイスを正当化しないと思っています。私は、図書館のデザイナーはただ一つのインターフェースを決めておくべきだと思います。たぶん、ここでは十分に明確ではない個人的な好みです。 – rudimenter

+0

GroupByとGroupJoinの混乱がありますか?それらはただ概念的にしか関連していません。しかし、それは単に答えのタイプミスです。 – sehe

8

ILookupとIDictionaryの間には別の重要な違いがあります。前者は、データを変更する方法がないという点で不変性を強制します消費者が明示的にキャストを行う場合を除く)。対照的に、IDictionaryには、データを変更できる「追加」のようなメソッドがあります。ですから、機能プログラミングや並列プログラミングの観点からは、ILookupは優れています。 (私は、グループではなくキーに1つの値しか割り当てないILookupのバージョンもありました。)

(Btw。IEnumerableとIListの関係は、 ILookupとIDictionaryの間のもの - 前者は不変、後者はそうではありません。)

+3

グループではなく単一項目の値だけを持つ 'ILookup 'が必要なのはなぜですか?これは 'Dictionary'が何であるか、あるいは' ReadOnlyDictionary'や 'IReadOnlyDictionary'が不変であるようにするためです。 – ErikE

関連する問題