минимальное значение в словаре с использованием linq - PullRequest
4 голосов
/ 06 сентября 2010

У меня есть словарь типа

Dictionary<DateTime,double> dictionary

Как получить из этого словаря минимальное значение и ключевые ядра, соответствующие этому значению, используя linq?

Ответы [ 4 ]

4 голосов
/ 07 сентября 2010

Агрегат

var minPair = dictionary.Aggregate((p1, p2) => (p1.Value < p2.Value) ? p1 : p2);

Используя могущественный метод Aggregate.

Я знаю, что MinBy чище в этом случае, но с Aggregate у вас больше энергии и еговстроенный.;)

4 голосов
/ 06 сентября 2010
var min = dictionary.OrderBy(kvp => kvp.Value).First();
var minKey = min.Key;
var minValue = min.Value;

Это не очень эффективно; Вы можете рассмотреть MoreLinq MinBy метод расширения.

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

2 голосов
/ 06 сентября 2010

Вы не можете легко сделать это эффективно в обычном LINQ - вы можете легко получить минимальное значение, но поиск ключа требует еще одного сканирования.Если вы можете себе это позволить, воспользуйтесь ответом Джесс.

Однако вам может понадобиться взглянуть на MinBy в MoreLINQ , что позволит вам написать:

var pair = dictionary.MinBy(x => x.Value);

После этого вы получите пару с ключом и значением только после одного сканирования.

РЕДАКТИРОВАТЬ: Как говорит Nappy, MinBy также находится в System.Interactive в ReactiveРасширения .

2 голосов
/ 06 сентября 2010
    Dictionary<DateTime, double> dictionary;
    //...
    double min = dictionary.Min(x => x.Value);
    var minMatchingKVPs = dictionary.Where(x => x.Value == min);

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

    var minMatchingKVPs = dictionary.Where(x => x.Value == dictionary.Min(y => y.Value));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...