Поиск конкретного ключа, который имеет наибольшее значение из словаряс лямбда-выражением - PullRequest
0 голосов
/ 07 марта 2012

У меня словарь вот так -

public static Dictionary<int, List<int>> pegMap = new Dictionary<int, List<int>>();

Теперь я заполнил словарь, как скажем -

Key: 1 => Value: [3,2]
Key: 2 => Value: []
Key: 3 => Value: [6,7]

Теперь я хочу найти ключ, который имеет наибольшее значение всписок.

Как и в этом случае, лямбда должна возвращать 3, что обозначает пару ключ-значение, где ключ 3, потому что число 7 присутствует в списке в словаре, где происходит ключбыть 3.

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Это немного бестолково, но должно работать.

var dict = new Dictionary<int, List<int>>();

    dict.Add(1, new List<int>() { 1, 2 });
    dict.Add(2, new List<int>() { 4, 5 });
    dict.Add(3, new List<int>() { 1, 7 });

    var max = dict.Select(x => new { Key = x.Key, Value = x.Value.Max() }).OrderByDescending(x => x.Value).First().Key;  
// returns 3
        // Other sample input 
        dict.Add(1, new List<int>() { 1, 2 });
        dict.Add(2, new List<int>() { 4, 7 });
        dict.Add(3, new List<int>() { 1, 2 });
        // returns 2
        dict.Add(1, new List<int>() { 1, 2 });
        dict.Add(2, new List<int>() { 4, 7 });
        dict.Add(3, new List<int>() { 1, 7 });
        // returns 2
        dict.Add(1, new List<int>() { 1,10 });
        dict.Add(2, new List<int>() { 4, 7 });
        dict.Add(3, new List<int>() { 1, 7 });
        // returns 1

Изменить: наименьшее значение в списке с наибольшим значением:

 var min_value_in_maxList = dict.Select(x => new { Key = x.Key, ValueMax = x.Value.Max(), ValueMin = x.Value.Min() }).OrderByDescending(x => x.ValueMax).First().ValueMin;
1 голос
/ 07 марта 2012

это должно работать,

pegMap.SelectMany(a => a.Value, (a, b) => new {holdKey = a.Key,listValue= b}).OrderByDescending(a=>a.listValue).First().holdKey;
1 голос
/ 07 марта 2012

К сожалению, нет ничего встроенного в LINQ to Objects, что делает это особенно приятным. Вы можете использовать MaxBy из моего проекта MoreLINQ , хотя с небольшим приемом необходимости использовать Max также в каждом списке:

var maxKey = pegMap.MaxBy(x => x.Value.Max())
                   .Key;

Обратите внимание, что если в списке несколько ключей с одинаковым верхним элементом, он вернет первый.

...