使用linq的字典中的最小值

时间:2010-09-06 19:50:46

标签: linq dictionary lambda

我有一个类型字典

Dictionary<DateTime,double> dictionary

如何使用linq从此字典中检索与此值对应的最小值和键?

4 个答案:

答案 0 :(得分:4)

var min = dictionary.OrderBy(kvp => kvp.Value).First();
var minKey = min.Key;
var minValue = min.Value;

虽然效率不高;您可能需要考虑MoreLinq's MinBy扩展方法。

如果您经常执行此查询,则可能需要考虑不同的数据结构。

答案 1 :(得分:4)

聚合

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

使用强大的Aggregate方法。

我知道MinBy在这种情况下更干净,但Aggregate你有更多的力量和内置。 ;)

答案 2 :(得分:2)

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

答案 3 :(得分:2)

在普通LINQ中你不能轻易有效地做到这一点 - 你可以轻松获得最小值,但找到密钥需要另外扫描。如果你负担得起,请使用Jess的答案。

但是,您可能需要查看MoreLINQ中的MinBy,以便您写一下:

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

然后,只需一次扫描,就可以得到密钥和值的对。

编辑:正如Nappy所说,MinBy也在Reactive Extensions中的System.Interactive中。

相关问题