2010-06-09 84 views
1

想象一下,你有這樣的一類:如何使用LINQ選擇具有最高值的項目?

class Foo { 
    string key; 
    int value; 
} 

你會如何選擇與富從IEnumeralbe<Foo>最高值?

一個基本的問題是保持迭代次數低(即在1),但會影響可讀性。畢竟,我能找到的最好的東西是沿着這條線:

IEnumerable<Foo> list; 
Foo max = list.Aggregate ((l, r) => l.value > r.value ? l : r); 

你能想出更好的方法嗎?

編輯:list.OrderByDescending(l => l.value).First();是我的首選選項,但它不是O(n)。

回答

7

您可以從Jon Skeet的MoreLinq項目中獲取MaxBy LINQ擴展方法。然後它只是:

Foo max = list.MaxBy(f => f.value); 
+0

現在很吸引人。 – mafu 2010-06-09 08:47:24

+0

是的,morelinq很棒。 – tzaman 2010-06-09 08:47:58

+0

或list.Where(w => w.value == list.Max(m => m.value)) – 2017-01-28 19:49:13

2

這裏的另一種選擇:

list.OrderByDescending(l => l.value).First(); 

list.OrderBy(l => l.value).Last(); 
+0

這是我以前使用的,但我認爲它不是O(n)。 – mafu 2010-06-09 08:40:40

+0

是的,不會的。 – 2010-06-09 08:44:28

1
Foo foo = list.Max(); 

但你必須實施美孚類型IComparable接口;

+0

不錯的主意,但我不能改變Foo。 – mafu 2010-06-09 08:52:48

相關問題