2009-08-12 13 views
6

私は、string型のキーとint型の値を持つ辞書のListを持っています。LINQを使用して辞書の一覧の各キーの最大値を調べる方法は?

辞書の多くは同じキーを持ちますが、すべてが同じではありません。

私の質問は:LINQを使用すると、どのようにすべての辞書の各キーに関連付けられた最大値を見つけることができますか?

{"alpha", 4}, 
{"gorilla", 2}, 
{"gamma", 3}, 
{"beta", 3}, 
{"monkey", 2} 

は(私は現在、リストをループして物事を追跡しています:私は含まれているコレクションのいくつかの種類をしたいと思い

var data = new List<Dictionary<string, int>> 
{ 
    new Dictionary<string, int> {{"alpha", 4}, {"gorilla", 2}, {"gamma", 3}}, 
    new Dictionary<string, int> {{"alpha", 1}, {"beta", 3}, {"gamma", 1}}, 
    new Dictionary<string, int> {{"monkey", 2}, {"beta", 2}, {"gamma", 2}}, 
}; 

次の入力与え例えばので

私自身、実際にそれを行うのにもっと良いLINQ風の方法があるかどうか疑問に思っています)

EDIT:文字列キーがあらかじめわかっています

答えて

9
var results = data.SelectMany(d => d) 
        .GroupBy(d => d.Key) 
        .Select(g => new 
{ 
    GroupName = g.Key, 
    MaxValue = g.Max(i => i.Value) 
}); 

以上をテストするために、次のような出力を得るために、この

foreach (var item in results) 
{ 
    Console.WriteLine(item); 
} 

を使用して...

{ GroupName = alpha, MaxValue = 4 } 
{ GroupName = gorilla, MaxValue = 2 } 
{ GroupName = gamma, MaxValue = 3 } 
{ GroupName = beta, MaxValue = 3 } 
{ GroupName = monkey, MaxValue = 2 } 
+0

マーベラス!なぜあなたはそれを見るといつも分かりますか:-) – Argos

+3

もちろん、同じことをする他の多くの方法があります: 'data.SelectMany(d => d).GroupBy(d => d.Key、d => d.Value、(k、i)=> new {GroupName = k、MaxValue = i.Max()}) 'または' from d from data.SelectMany(i => i) グループd.Value by d .Key into g select new {GroupName = g.Key、MaxValue = g.Max()} 'は2つあります。 –

関連する問題