2010-06-09 57 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