辞書オブジェクトへのLINQグループ化


161

LINQを使用してDictionary<string, List<CustomObject>>からを作成しようとしていますList<CustomObject>。これを「var」を使用して機能させることができますが、匿名型を使用したくありません。ここに私が持っているものがあります

var x = (from CustomObject o in ListOfCustomObjects
      group o by o.PropertyName into t
      select t.ToList());

Cast<>()一度LINQライブラリから使用してみましxたが、無効なキャストであるためにコンパイルの問題が発生します。


var x =(ListOfCustomObjectsグループのCustomObject oからo.PropertyNameを使用してt select tに)を試すとどうなるでしょうか?ToList();
esastincy

44
このために設計されたToLookupを使用するのではなく、これを行う必要がある理由はありますか?
Jon Skeet、2011年

1
ジョン、この状況でのToLookupの動作の例を投稿していただけませんか。私はそのLINQメソッドに精通していません。
Atari2600 2011年

8
@JonSkeetあなたは素晴らしいです!(つまり、誰もがそれをすでに知っていましたが、それでもなおです。)ToLookupを使用することを計画していなかった理由は、今まで聞いたことがなかった原因でした。今私は知っている!
neminem 2013

1
完全を期すためにvar、「匿名」タイプを使用するのではなく、「暗黙的」タイプを使用しています。匿名型は、構築を処理するためにコンパイラによって作成される新しいクラスですnew { thing = "stuff" };。暗黙の型は既存のクラスでvarあり、変数がすぐに割り当てられているときにそれらを参照する便利な方法です。変数の型は、割り当てられているオブジェクトの型から推測できます。匿名型を参照する変数を暗黙的に入力することもできます。var a = new { thing = "stuff" };
Michael Blackburn

回答:


350
Dictionary<string, List<CustomObject>> myDictionary = ListOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToDictionary(g => g.Key, g => g.ToList());

6
リスト値として「CustomObject」のプロパティが必要でない限り(この回答には示されていません)、ToLookup()を推奨する質問に対する彼のコードネスJon Skeetのコメントを確認する価値があります。
ショーン

3
これは、不変の結果が必要な場合に行う方法です。ToLookupは不変です。
2014年

1
私の2セント(ちょうどそれが私を1時間苦労させたからです:)):プロパティでグループ化するときは、プロパティに値があることを確認してください!そうでない場合、Todictメソッドはキーの生成に失敗します(少なくともString-Propertiesの場合...):)
dba

.GroupBy(o => o.PropertyName).ToDictionary(g => g.Key, g => g.ToList())これは、拡張Linqライブラリの一部である可能性があります。私たちはのみ行う必要があります.ToDictionary(o=>o.PropertyName)
Jaider

3
@Jaider、そのような機能はすでにあります。単にに置き換えToDictionaryてくださいToLookup
Robert Synoradzki 2017

19

@Michael Blackburnについてコメントすることはできませんが、この場合GroupByは必要ないため、反対票を獲得したと思います。

次のように使用します。

var lookupOfCustomObjects = listOfCustomObjects.ToLookup(o=>o.PropertyName);
var listWithAllCustomObjectsWithPropertyName = lookupOfCustomObjects[propertyName]

さらに、GroupBy()。ToDictionary()を使用する場合よりもパフォーマンスが優れていることを確認しました。


私は文字変換を実行しており、質問に可能な限り最善の方法で答えていませんでした。
マイケルブラックバーン

1

@ atari2600の場合、ラムダ構文でToLookupを使用すると次のようになります。

var x = listOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToLookup(customObject => customObject);

基本的には、IGroupingを取得して、PropertyNameの値をキーとして、リストのディクショナリに具体化します。


なぜ反対票か。これは正確ではありませんか/質問に答えていますか?
マイケルブラックバーン

1
見逃した場合のために、@ RuudvKは彼の回答の中で、彼が反対投票を疑っているのはGroupByが不要であるためだと述べていますToLookup仕事を終わらせる過負荷があります。
Jeff B

タグ付けしてくれてありがとう。理にかなっている、グループ化は構文的に不要であり、クエリ構文からメソッド構文への移行をより明確にするためだけに残していた。
マイケルブラックバーン

GroupBy(パラメーターが1つだけのオーバーロード)はIEnumerable <IGrouping <TKey、TSource >>を返します。その後のToLookupは、IDLictionary <TKey、IList <TSource >>に似ていない非常に複雑な型に変換します。ToLookupだけです。適切なタイプを返します。
xtofs

-1

以下は私のために働いた。

var temp = ctx.Set<DbTable>()
  .GroupBy(g => new { g.id })
  .ToDictionary(d => d.Key.id);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.