使用Linq仅选择最低的值

22

你好,我有以下的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
3个回答

49

嗯,你可以这样做:

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 SQL中这是正确的 - 但是在LINQ to Objects中,把它全部放在一个查询中可能会更,让数据库解决它。


这个方法会比KJN的答案更快吗?他的答案会导致Min()在数据列表中的每个条目内被重新计算,还是编译器会对这个值进行一些缓存。我怀疑不会,但我想确认一下。 - Øyvind Bråthen
如果您正在使用LINQ to Objects,那么是的 - Min()将为列表中的每个条目重新计算。 - Jon Skeet

10

你可以尝试像这样做:

data.Where (d => d == data.Min())

请注意,这不一定是最快的方法。


3
如果你将数据的最小值缓存到一个变量中,就可以将时间复杂度从O(n^2)降至O(n)。我对这些linq函数的实现和C#编译器做了一个假设。 - JSideris

6

首先,找到最小值:

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

您的情况不需要排序。

2
感谢你是唯一一个记得检查大于0的数字的人 :-) - gulbaek

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