リストに次のオブジェクトがあります。
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());
しかし、これを単一のステートメントにする方法はありますか?
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);
すでにワンライナーになっています。最初の行の最後にToDictionary
を置くだけです。短くしたい場合は、クエリ構文の代わりに機能構成構文を使用します。
私は少しトピック外に行きますが、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
これがこの種のクエリを必要とする他の誰にも役立つことを願っています。