2013-05-03 2 views
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? Здесь он все еще возвращает один Ключ, который приходит первым во время прохождения диктатуры.

Редактировать

Пусть словарь имеет значения P1 с максимальным значением сказать 3.52. Теперь, если есть две записи в словаре со значением Р1 = 3,52, я хочу, чтобы получить как ключи, относящиеся к этому значению

+0

Я не понимаю. Приведите пример того, что вы хотите против того, что вы получаете. –

+0

@MartinMulder Я отредактировал свой вопрос .. –

ответ

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 выбирает группу с наивысшими значениями.

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); 

(Некомпьютерный код, скомпилированный мозгом). Если вы собираетесь сделать что-то сложное, как это дважды, то, возможно, стоит их обобщать, используя лямбда, чтобы выбрать P1 из структуры. (Также может быть проще всего написать цикл, чтобы сделать это в этот момент, вместо того, чтобы пытаться обучить это в Агрегате - я не ожидаю, что какой-либо ORM может что-то сделать с этим, кроме как просто вывести его на C#.)

Смежные вопросы