Понимание лямбда-выражений в C # - PullRequest
2 голосов
/ 29 декабря 2011

Я новичок в лямбдах, и они казались довольно простыми, пока я не попытался сделать что-то более сложное.У меня есть этот словарь.

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

, из которых я хочу получить ключ пары ключ-вал с наибольшим значением.Я попробовал следующее:

dict.Keys.Max(g => dict[g])

Причина в том, что из списка ключей выберите тот, для которого dict [ключ] является наибольшим.Однако это выбирает самое большое значение, а не соответствующий ему ключ.

Ответы [ 4 ]

6 голосов
/ 29 декабря 2011

dict.Keys.OrderByDescending(g => dict[g]).First() будет выполнять то, что вы хотите, но может быть неэффективно для больших словарей.MaxBy в книге Джона Скита MoreLinq будет делать именно то, что вы хотите эффективно.

1 голос
/ 29 декабря 2011

Я решил добавить ответ, основываясь на своих мыслях о МакКее. Это будет выполняться очень быстро, учитывая стандартные методы LINQ, предоставляя только ключ:

var maxValue = dict.Max(p => p.Value);
var keys = dict.Where(p => p.Value == maxValue).Select(p => p.Key);

Теперь, если OP знает, что всегда есть только один ключ (без повторяющихся значений), тогда улучшение (очень маленькое) будет в том, чтобы использовать First с этим, так как из-за ленивой оценки только элементы до одного с максимальное значение будет оценено после того, как все будут оценены, чтобы сначала найти максимальное значение:

var key = dict.Where(p => p.Value == maxValue).First().Key;
1 голос
/ 29 декабря 2011
var maxValue = dict.Max((maxPair) => maxPair.Value);
var maxPairs = dict.Where((pair) => pair.Value == maxValue);

Это даст вам список всех пар, которые имеют максимальное значение.

Если вы просто хотите ключи, вы можете сделать это потом:

var maxKeys = maxPairs.Select((pair) => pair.Key);
0 голосов
/ 29 декабря 2011

dict.OrderBy(v => v.Value).Last().Key;

должен это сделать. В основном вы заказываете KeyValuePair по значению и выбираете последний, который будет максимальным. А внутри последнего вас интересует только Ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...