0

私は、私が持っているリストを実行しようとしていGroupByます。OrderByこれまでの私のコードは次のとおりです。

reportList.GroupBy(x => x.Type).ToDictionary(y=>y.Key, z=>z.OrderBy(a=>a.Lost));

私がlinqで尋ねた最後の質問の助けを借りて、ToDictionaryおそらく不要だと思いますが、それがなければ内部値にアクセスする方法がわかりません。

明確にするためにGroupBy、プロパティが必要であり、取得したType内部グループをプロパティ (整数) にする必要があります。より良い、より効率的な方法があるかどうか、または少なくとも私が行ったことよりも優れているかどうかを知りたいです。OrderByLost

答えだけでなく説明もいただければ幸いです。

4

3 に答える 3

3

はい、より良いアプローチがあります。変数にランダムな名前 (x、y、z、a) を使用しないでください。

reportList.GroupBy(r => r.Type)
          .ToDictionary(g => g.Key, g => g.OrderBy(r => r.Lost));

長い名前を使用して、コードをよりわかりやすくすることもできます (クエリを作成するコンテキストによって異なります)。

reportList.GroupBy(report => report.Type)
          .ToDictionary(group => group.Key, 
                        group => group.OrderBy(report => report.Lost));
于 2013-07-22T16:05:57.503 に答える
2

コードは基本的に次のことを行います。

  1. 要素をタイプ別にグループ化する
  2. GroupBy の結果をディクショナリに変換します。ディクショナリの値は、OrderBy の呼び出しに由来する IEnumerables です。

コードの正確さに関しては、IMO は完全に問題ありませんが、効率の面で改善される可能性があります (ニーズに依存する場合でも)。

実際、あなたのコードでは、列挙するたびに辞書の値が遅延評価され、結果としてOrderByメソッドが呼び出されます。

おそらく、一度実行して結果を次のように保存できます。

var dict = reportList
           .GroupBy(x => x.Type)
           .ToDictionary(y => y.Key, z => z.OrderBy(a => a.Lost).ToList()); 
// note the ToList call

またはこの方法で:

var dict = reportList.OrderBy(a => a.Lost)
                     .GroupBy(x => x.Type)
                     .ToDictionary(y => y.Key, z => z); 
// here we order then we group, 
// since GroupBy guarantees to preserve the original order
于 2013-07-22T16:09:23.610 に答える
1

私にはうまく見えます。Dictionary の代わりに匿名型を使用すると、このクエリの結果を使用するコードの可読性が向上する可能性があります。

reportList.GroupBy(r => r.Type)
    .Select(g => new { Type = g.Key, Reports = g.OrderBy(r => r.Lost) });
于 2013-07-22T15:59:31.397 に答える