我有一个类型字典
Dictionary<DateTime,double> dictionary
如何使用linq从此字典中检索与此值对应的最小值和键?
答案 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中。