3

我有一个类型的字典

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 值的键怎么办?在这里,它仍然返回一个在字典遍历期间首先出现的 Key。

编辑

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

4

2 回答 2

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选择具有最高值的组。

于 2013-05-03T08:46:47.277 回答
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# 中执行它。)

于 2013-05-03T08:54:28.130 回答