2009-06-02 10 views
86

をグループ化すると、リスト上の辞書を作成します。今すぐ私は、リスト内の次のオブジェクト持って

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()); 

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

答えて

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

これは動作します。

6

あなたはすでに1つのライナーにしました。最初の行の末尾にToDictionaryを置くだけです。より短くしたい場合は、クエリ構文の代わりに機能合成構文を使用してください。

170

だけmquander's suggestionコンクリートを作るために:

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

あなたはあまりにも短い変数名を使用した場合はもちろん、それは短い作ると思います:)

をしかし、私はLookupはもっとあるかもしれないことを示唆しているかもしれません適切な?検索は、基本的にIEnumerable<T>の鍵から辞書です - あなたは本当にがリストとして値を必要としない限り、それはToLookupコールでさえ短い(そしてより効率的な)コードになり:私は「

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass 
          .ToLookup(x => x.GroupKey); 
+1

私はルックアップが、すべてのリクエストに対して新鮮な結果を構築するため、長期的な環境で、ビルドされた辞書に比べて、それほど良くないとは思っていませんでした。 –

+0

いいえ、ルックアップ全体を作成します。一般に、ToXXXは遅延実行を使用しません。 –

+1

(実際に延期されているグループ分けを考えているかもしれません) –

2

をメートル

あなた...ここにオフトピックわずかを行くが、私はLINQの中の辞書の辞書を作成する方法を探していたbecausde私はこのスレッドになった、とここでの会話は答えに私を導きます linqを使って複数レベルの辞書を作成すると便利です検索するキーまたはディメンションが2つ以上あるシナリオ次のように

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 

・ホープこの種のクエリ。

関連する問題