2010-09-29 53 views
12

嗨 我得到了以下linq用于在最低值之后对输入进行排序。 但我希望它只输出最低值。仅选择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 

回答

28

嗯,你可以这样做:

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中,它可能会更好地使用在一个查询中完成所有操作,并让数据库将其排除。

+0

这会比KJN的答案更快吗?他的回答是否会导致Min()被重新计算用于数据列表中的每个条目,或者编译器是否会对此值进行缓存。我对此表示怀疑,但我希望以某种方式得到证实。 – 2010-09-29 08:53:11

+0

是的,它通常会更快。 :) – kjn 2010-09-29 08:55:59

+0

@ØyvindBråthen:如果您使用的是LINQ to Objects,那么yes - Min()将会重新计算列表中的每个条目。 – 2010-09-29 09:09:12

8

你可以尝试这样的事:

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

注意这不是必需的这是最快的方法。

+0

感谢您的帮助KJN – gulbaek 2010-09-29 09:13:46

+0

如果您将data.Min()缓存在变量中,您可以将它从O(n^2)中提取到O(n)。我正在假设这些linq函数和C#编译器的实现。 – JSideris 2018-02-01 20:41:46

5

首先,找到的最低值:然后,选择项目

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 2010-09-29 09:14:46