2010-09-29 52 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