2012-04-18 2 views
75

.ToLookup<TSource, TKey>ILookup<TKey, TSource>を返します。 ILookup<TKey, TSource>もインターフェイスIEnumerable<IGrouping<TKey, TSource>>を実装しています。なぜToLookupとGroupByが異なるのですか?

.GroupBy<TSource, TKey>IEnumerable<IGrouping<Tkey, TSource>>を返します。一方GROUPBYができない、

ILookupは便利インデクサ性を有するので、辞書状(又はルックアップなど)方法で使用することができます。インデクサーのないGroupByは、うまくいくでしょう。戻りオブジェクトを参照できる唯一の方法は、それをループ(または別のLINQ拡張メソッドを使用)することです。つまり、GroupByが動作する場合でも、ToLookupも同様に動作します。

すべてこれは私が今までGROUPBYを気にする理由質問で私を残し?なぜそれが存在すべきですか?

+5

'GroupBy'は' ILookup'が – Magnus

+5

ないGROUPBYは」 'IQuerable'、doesnのですリストを列挙する[ToLookup](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.tolookup.aspx)は、同じ方法で列挙します。ToList/ToArray – Aducci

+3

私は再オープンのためにこれをノミネートしましたそれは疑わしい重複は* ToLookup *ではなく* GroupBy *と* ILookup *ではなく、* IGrouping *についてです。これらの違いは、これらの違いとは異なります。これは、質問間の回答の違いから明らかになるはずです。 – Sam

答えて

130

なぜ私が今までにGROUPBYを気でしょうか?なぜそれが存在すべきですか?

十億行のリモートデータベーステーブルを表すオブジェクトでToLookupを呼び出すとどうなりますか?

10億行がワイヤを介して送信され、ルックアップテーブルをローカルに構築します。

このようなオブジェクトでGroupByを呼び出すとどうなりますか?

クエリオブジェクトが作成されました。物語の終わり。そのクエリオブジェクトは、次に列挙されている場合

は、表の分析には、データベース・サーバにを行われ、グループ化された結果は、需要時に数の上に戻って送信されます。

論理的には同じですが、のパフォーマンスへの影響は、それぞれとは全く異なります。 ToLookupの呼び出しはを意味します。グループ全体で今すぐグループ化されたキャッシュが必要です。 GROUPBYを呼び出すと、意味「私は質問を表現するためにオブジェクトを構築しています 『何これらの事は、私はグループでそれらを組織した場合のように見えるでしょう?』」

+3

poster doesn '特に 'IQueryable '表現を対象としています。あなたの答えはそのような状況をカバーしていますが、単にIEnumerable (LINQ-to-Objects)のようなものであれば、@Shlomoがしようとしていると思うに着く。 * 'IQueryable 'ではなく、LINQからオブジェクトへのケース。 – casperOne

+0

可能であれば、LINQは一貫性があると私にとって有益です。私は、LINQ-to-SQLでのその有用性を示すことは、LINQ-to-Objectsに残すことを正当化するのに十分であると考えています。 – Brian

+19

@casperOne:あなたは私のことを理解できていないと思います。 LINQからオブジェクトへのケースでも、GroupBy *を呼び出すことはコレクションを繰り返すことはありません。 (あなたが削除した答えにAducciが指摘したように)それは基本的な違いです。 –

12

は、二人は似ていますが、さまざまなシナリオで使用されています。 .ToLookup()は、既にグループのすべてのグループ(グループのコンテンツではない)が熱心に読み込まれている、すぐに使用できるオブジェクトを返します。一方、.GroupBy()は、遅延ロードされたグループのシーケンスを返します。

異なるLINQプロバイダは、グループの熱心および遅延ローディングのために異なる動作を有することができます。 LINQ-to-Objectではほとんど差はありませんが、LINQ-to-SQL(またはLINQ-to-EFなど)では、グループ化操作はクライアントではなくデータベースサーバーで実行されるため、グループキー(HAVING句を生成する)に対して追加のフィルタリングを行い、すべてのグループではなく一部のグループのみを取得します。 .ToLookup()は、すべての項目が熱心にグループ化されているため、そのようなセマンティクスを許可しません。簡単なLINQの世界の言葉で

70

: - 即時実行

  • GroupBy() -

    • ToLookup()遅延実行
  • 関連する問題