web-dev-qa-db-ja.com

グループ化を使用してリストに辞書を作成する

リストに次のオブジェクトがあります。

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}

次に、次の辞書を作成します。

Dictionary<int, List<DemoClass>>

List<DemoClass>をプロパティGroupKeyでグループ化したいのですが、これがどのように行われているのかわかりません。

少し考えて、必要な動作を次のように達成しました。

var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                            group demoClass by demoClass.GroupKey
                            into groupedDemoClass
                            select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

しかし、これを単一のステートメントにする方法はありますか?

99
var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                          group demoClass by demoClass.GroupKey
                          into groupedDemoClass
                          select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

これは動作します!!!

mquanderの提案 具体的にするために:

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .GroupBy(x => x.GroupKey)
                             .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

もちろん、より短い変数名も使用する場合は短くします:)

ただし、 Lookup の方が適切だと思いますか?ルックアップは基本的に、キーからIEnumerable<T>への辞書です-実際に値をリストとしてneedしない限り、コードを均一にします ToLookup 呼び出しでより短く(そしてより効率的に):

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .ToLookup(x => x.GroupKey);
187
Jon Skeet

すでにワンライナーになっています。最初の行の最後にToDictionaryを置くだけです。短くしたい場合は、クエリ構文の代わりに機能構成構文を使用します。

6
mqp

私は少しトピック外に行きますが、Linqで辞書の辞書を作成する方法を探していたので、このスレッドに行きました。ここでの会話は答えにつながります。 。

can linqを使用してマルチレベルの辞書を作成します。これは、検索するキーまたはディメンションが複数あるシナリオに役立ちます。秘Theは、次のようにグループ化を作成し、それを辞書に変換することです。

  Dim qry = (From acs In ActualSales _
             Group By acs.ProductID Into Group _
             Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
            ).ToDictionary(Function(c) c.ProductID)

結果のクエリは次のように使用できます。

 If qry.ContainsKey(_ProductID) Then
      With qry(_ProductID)
          If .Months.ContainsKey(_Period) Then
             ...
          End If
      End With
 End If

これがこの種のクエリを必要とする他の誰にも役立つことを願っています。

3
Mark