使用linq的字典中的最小值

使用linq的字典中的最小值,linq,dictionary,lambda,Linq,Dictionary,Lambda,我有一本打字词典 Dictionary<DateTime,double> dictionary 字典 如何使用linq从此字典中检索与此值相关的最小值和键 var min = dictionary.OrderBy(kvp => kvp.Value).First(); var minKey = min.Key; var minValue = min.Value; 但这不是很有效;您可能需要考虑 MyBi< /Cord>扩展方法。 如果你经常执行这个查询,你可能需要考虑一个不

我有一本打字词典

Dictionary<DateTime,double> dictionary
字典
如何使用linq从此字典中检索与此值相关的最小值和键

var min = dictionary.OrderBy(kvp => kvp.Value).First();
var minKey = min.Key;
var minValue = min.Value;
但这不是很有效;您可能需要考虑<代码> MyBi< /Cord>扩展方法。


如果你经常执行这个查询,你可能需要考虑一个不同的数据结构。

在正常的LINQ中,你不能很容易地做到这一点——你可以很容易地得到最小值,但是找到这个键需要另一个扫描。如果你负担得起,就用Jess的答案

    Dictionary<DateTime, double> dictionary;
    //...
    double min = dictionary.Min(x => x.Value);
    var minMatchingKVPs = dictionary.Where(x => x.Value == min);
但是,您可能想看看
MinBy
,在其中您可以编写:

var pair = dictionary.MinBy(x => x.Value);
只需进行一次扫描,就可以得到包含键和值的对

编辑:正如Nappy所说,
MinBy
也在系统中。在中交互。

聚合
var minPair=dictionary.Aggregate((p1,p2)=>(p1.Value
使用强大的
Aggregate
方法


我知道在这种情况下,
MinBy
更干净,但是使用
Aggregate
您可以获得更强大的功能和内置功能

@Jess:Read问题:“最小值和该值对应的键”@Jess:yes。他确实用单数形式说了“key”。我觉得这个答案比使用聚合方法时给出的代码可读性更强。单行版本的效率为O(n^2)-它会在字典中找到每一对的最小值。从未见过更多的LINQ。。。看起来很整洁。
MinBy
也是System.Interactive.dll的一部分,可能与
var pair = dictionary.MinBy(x => x.Value);
var minPair = dictionary.Aggregate((p1, p2) => (p1.Value < p2.Value) ? p1 : p2);