使用 LINQ 在字典中查找最小值

4

我有一个类型为

字典
Dictionary<DateTime,double> dictionary

如何使用linq从字典中检索最小值及其对应的键?

4个回答

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

虽然这种方法并不是很高效,你可能需要考虑使用MoreLinqMinBy扩展方法。

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


@Jess:请仔细阅读问题:“最小值和与该值对应的”。 - Ani
@Jess:是的。他确实用单数形式说“key”。 - Robaticus
我点赞了,因为我觉得这个答案给出的代码比使用Aggregate方法更易读。 - Mal Ross

4

聚合

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

使用强大的Aggregate方法。
我知道在这种情况下使用MinBy更简洁,但是使用Aggregate可以获得更多的能力和内置功能。;)

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
一行代码的效率为O(n^2)——它会在每一对中查找字典中的最小值。 - Jon Skeet

2

在普通的 LINQ 中,你无法轻松高效地实现这一点 - 你可以轻松获得最小值,但找到键需要再次扫描。如果你能接受这种情况,可以使用 Jess 的答案。

然而,你可能想要查看 MoreLINQ 中的 MinBy,它让你可以这样写:

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

然后,您将拥有带有键和值的一对,仅需单次扫描即可完成。

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


从未见过 MoreLINQ...看起来相当不错。 - Beep beep
1
MinBy 也是 Reactive Extensions for .NET (Rx) 的 System.Interactive.dll 的一部分。 - Nappy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接