我有一个类型的字典

Dictionary<int, GValue>


其中GValue是包含两个双精度值P1和P2的对象

我正在尝试使用以下代码从字典中获取最大值的键

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的键。

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

编辑

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

最佳答案

如果希望所有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选择具有最高值的组。

09-05 16:09
查看更多