2013-05-03 5 views
0

У меня есть словарь типаПолучить максимальное значение из словаря

Dictionary<int, GValue> 

где GValue это объект, который содержит два двойных значений P1 и P2

Как я могу получить максимум P1 и P2 из этого словаря?

я пытался до сих пор это

c.CalculateGraphMetrics(nodeXLControl1.Graph).Max(s => s.Value.P1); 

Это не дает мне ошибку, но результат показывает на отладку

Expression cannot contain Lambda expressions 
+0

Как я могу получить ключ, связанный со значением –

+0

Возможный дубликат [Как использовать LINQ для выбора объекта с минимальным или максимальным значением свойства] (http://stackoverflow.com/questions/914109/how-to-use- linq-to-select-object-with-minimum-or-maximum-property-value) – nawfal

ответ

1

Re. получения ключа, соответствующий максимальное значение: Я вижу много сложных реализации MaxBy, когда вы можете использовать один из overloads of Aggregate к аналогичному эффекту:

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

Edit: Если вы хотите получить несколько максимальных клавиши, вы» будет нужно что-то вроде

var allMaxKeysForP1 = dict.Keys.Aggregate(
    new { Value = double.NegativeInfinity, Keys = new List<int>() }, 
    (a, k) => 
     { 
      if (a.Value > dict[k].P1) return a; 
      if (a.Value.Equals(dict[k].P1)) 
      { 
       a.Keys.Add(k); 
       return a; 
      } 
      return new { Value = dict[k].P1, Keys = new List<int> { k } }; 
     }, 
    a => a.Keys); 

в какой момент вы можете рассмотреть вопрос о реализации этого в качестве AllMaxBy метода.

+0

Если есть два ключа, которые имеют значения maxP1, то как он будет показывать обе клавиши –

+0

Я добавил примерный агрегат для этого случая. – Rawling

1

Немедленное окно не поддерживает лямбда-выражения.

Ваш код в порядке, но чтобы получить этот результат в непосредственном окне, вы должны иметь его как метод в классе и скомпилировать его.

+0

Ну, решила эту проблему. Как я могу получить ключ, связанный со значением –

+0

@RajeevKumar Max не очень удобен для этого, но есть аналогичный вопрос, который использует пользовательский сопоставитель для хранения всего объекта, а не только одного ощущения в результате ... http://stackoverflow.com/questions/1101841/linq-how-to-perform-max-on-a-property-of-all-objects-in-a-collection-and-ret и http://stackoverflow.com/questions/11520666/get -from-a-listt-the-record-with-maximum-value-of-the-specific-property/11520938 # 11520938 –

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