我有一个类型的字典
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
选择具有最高值的组。