我有一个类型字典
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的条目,我想获得与此值相关的两个键
答案 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#中执行它。)