1. ホーム
  2. c#

[解決済み] ILookup<TKey, TVal> vs. IGrouping<TKey, TVal>.

2023-08-25 13:34:54

質問

の違いを明確にするのに苦労しています。 ILookup<TKey, TVal> IGrouping<TKey, TVal> というように、LINQはこの問題を複雑にしました。 LINQは、この問題をさらに悪化させました。 IGrouping アイテムのシーケンスを生成する一方で ToLookup の拡張メソッドを提供しています。そのため、もっとよく見るまでは同じもののように感じられました。

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

と等価である。

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

とはよく似ていますね。

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

以下の例えは正しいですか?

  1. an IGrouping<TKey, TVal> は1つのグループ(つまりキーになるシーケンス)です。 KeyValuePair<TKey, TVal> で、値は実際には(単一の要素ではなく)一連の要素である。
  2. IEnumerable<IGrouping<TKey, TVal>> はそれらのシーケンスです。 IDictionary<TKey, TVal>
  3. ILookup<TKey, TVal> は、どちらかというと IDictionary<TKey, TVal> のようなもので、 値は実際には一連の要素である

どのように解決するのですか?

はい、すべて正しいです。

そして ILookup<TKey, TValue> も拡張しています。 IEnumerable<IGrouping<TKey, TValue>> を継承しているので、特定のキーを探すだけでなく(あるいはその代わりに)すべてのキーとコレクションのペアを反復処理することができます。

私は基本的に ILookup<TKey,TValue> と同じように IDictionary<TKey, IEnumerable<TValue>> .

念頭に置くべきは ToLookup は「今すぐやる」(即時実行)であるのに対して GroupBy は遅延されます。たまたま、quot;pull LINQ" が動作する方法では、pull LINQ を開始するときに IGrouping の結果から GroupBy の結果から、それはとにかくすべてのデータを読まなければなりません(途中でグループを切り替えることができないからです)一方、他の実装ではストリーミング結果を生成することができるかもしれません。(Push LINQではそうなっています。LINQ to Eventsも同じだと期待しています)。