2013-05-03 61 views
3

获取最大价值键我有一个类型的词典从字典

Dictionary<int, GValue> 

其中的GValue是包含两个双值P1和P2

我试图让从最大值键的对象使用follwing代码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的键正确。

但是,如果指令包含多个关键字,并且最大值为P1或P2值? 这里它还是返回一个在执行遍历期间出现的key。

编辑

假设字典有值P1与最大值说3.52。现在,如果在字典中的两个条目与值P1 = 3.52,我想如果你希望所有KeyValuPairs具有最大价值,你可以用它来获得两个与此相关的值

+0

我不明白。举一个你想要的东西和你得到的东西的例子。 – 2013-05-03 08:46:06

+0

@MartinMulder我编辑了我的问题.. – 2013-05-03 08:50:05

回答

2

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

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#中执行它。)