使用 Linq 仅选择最小值
Posted
技术标签:
【中文标题】使用 Linq 仅选择最小值【英文标题】:Select only the lowest values with Linq 【发布时间】:2010-09-29 08:44:29 【问题描述】:嗨 我得到了以下 linq,用于在最低值之后订购我的输入。 但我希望它只输出最低值。
var sortedDict = (from entry in x where entry.Value > 0 orderby entry.Value ascending select entry);
现在如果它得到以下输入。
3 4 2 6 2
这将是我的输出
2 2 3 4 6
我需要在我的 linq 中更改什么,所以我只能得到这个输出
2 2
【问题讨论】:
【参考方案1】:好吧,你可以这样做:
int min = x.Min(entry => entry.Value);
var lowestValues = x.Where(entry => entry.Value == min);
请注意,我已明确将它们分开,就像您使用 Where(entry => entry.Value == x.Min(y => y.Value))
一样,它会在每次迭代中寻找最小值。另一方面,LINQ to Objects 也是如此 - 但在 LINQ to SQL 中,更好在一个查询中完成所有操作,然后让数据库对其进行排序。
【讨论】:
这会比 KJN 的答案更快吗?他的回答会导致 Min() 为数据列表中的每个条目重新计算,还是编译器会对该值进行一些缓存。我对此表示怀疑,但我想以一种或另一种方式确认它。 @Øyvind Bråthen:如果您使用的是 LINQ to Objects,那么可以 - 将为列表中的每个条目重新计算 Min()。【参考方案2】:你可以试试这样的:
data.Where (d => d == data.Min())
请注意,这不一定是最快的方法。
【讨论】:
如果将 data.Min() 缓存在变量中,则可以将其从 O(n^2) 变为 O(n)。我正在假设这些 linq 函数和 C# 编译器的实现。【参考方案3】:首先,找到最小值:
var min = (from entry in x where entry.Value > 0 select entry).Min();
然后,选择项目:
var sortedDict = from entry in x where entry.Value == min select entry
您的方案不需要排序。
【讨论】:
感谢您成为唯一记得检查 0 以上数字的人 :-)以上是关于使用 Linq 仅选择最小值的主要内容,如果未能解决你的问题,请参考以下文章