使用 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 仅选择最小值的主要内容,如果未能解决你的问题,请参考以下文章

比较两个字典并使用 Linq 确定最小值

LINQ 查询以从分组中查找最小值 - 无法创建类型为“X”的常量

使用LINQ在数组中查找最小和最大日期?

仅返回 RANK() 之后的最小值

python 对于每个键,仅选取最小(或最大)值作为值

使用 LINQ 在 c# 中获取 List<> 元素位置