从字典中获取最大价值的密钥

时间:2013-05-03 08:40:14

标签: c# linq dictionary

我有一个类型字典

Dictionary<int, GValue> 

其中GValue是一个包含两个双精度值P1和P2

的对象

我正在尝试使用以下代码获取来自dictinary的最大值的密钥

var keyForMaxP1 = dict.Keys.Aggregate((i, j) => dict[i].P1 >= dict[j].P1 ? i : j);
var keyForMaxP2 = dict.Keys.Aggregate((i, j) => dict[i].P2 >= dict[j].P2 ? i : j);

它为我提供了最大P1和P2的键。

但是如果dictinary包含多个具有最大P1或P2值的键? 在这里它仍然返回一个在遍历dictinary时首先出现的Key。

修改

假设字典的值为P1,最大值为3.52。现在,如果字典中有两个值为P1 = 3.52的条目,我想获得与此值相关的两个键

2 个答案:

答案 0 :(得分:2)

如果您希望所有KeyValuPairs都具有最大值,则可以使用Enumerable.GroupBy

var MaxP1KeyValues = dict.GroupBy(kv => kv.Value.P1)
    .OrderByDescending(g => g.Key).First();
var MaxP2KeyValues = dict.GroupBy(kv => kv.Value.P2)
    .OrderByDescending(g => g.Key).First();

foreach (var kv in MaxP1KeyValues)
{
    Console.WriteLine("Key:{0} Value-P1:{1}", kv.Key, kv.Value.P1);
}
foreach (var kv in MaxP2KeyValues)
{
    Console.WriteLine("Key:{0} Value-P2:{1}", kv.Key, kv.Value.P2);
}

这会将字典中的所有KeyValuePair<int, GValue>按P1 / P2的值分组,OrderByDescending + First选择值最高的组。

答案 1 :(得分:0)

您可以聚合到一个集合中,例如

var keysForMaxP1 = dict.Aggregate(
                       new { Max = double.MinVal, Keys = new List<int>()},
                       (state, entry) => {
                           if (entry.Value.P1 > state.Max) {
                               state.Max = entry.Value.P1;
                               state.Keys = new List<int>() { entry.Key };
                           } else if (entry.Value.P1 == state.Max) {
                               state.Keys.Add(entry.Key);
                           }
                           return state;
                       }, state => state.Keys);

(未经测试的,经过大脑编写的代码)。但是,如果你要做两次这样复杂的事情,可能值得通过使用lambda从结构中选择P1来使它们通用。 (在这一点上编写一个循环来执行此操作可能也是最简单的,而不是试图将其变成聚合 - 我不希望任何ORM可以做任何事情而不仅仅是在C#中执行它。)