Linq:如何对集合中所有对象的属性执行.max(),并返回最大值[的对象

Linq:如何对集合中所有对象的属性执行.max(),并返回最大值[的对象

我有一个有两个int属性的对象列表。该列表是另一个Linq查询的输出。对象:

public class DimensionPair  {
    public int Height { get; set; }
    public int Width { get; set; }}

我想在列表中找到并返回其中最大的对象Height财产价值

我可以设法获得最高值的Height值,而不是对象本身。

我能和Linq一起做这个吗?多么,怎样?


慕标琳琳
浏览 2982回答 3
3回答

皈依舞

我们有一个可拓法才能做到这一点MoreLINQ..您可以查看那里的实现,但基本上它是迭代数据的情况,记住我们到目前为止看到的最大元素以及它在投影下产生的最大值。在你的情况下,你会做这样的事情:var item = items.MaxBy(x => x.Height);这比这里提出的任何解决方案都要好,除了Mehrdad的第二个解决方案(基本上与MaxBy):它是O(N)不像先前接受的答复,它在每次迭代中找到最大值(使其为O(n^2)。排序解为O(N Logn)拿着Max值,然后找到带有该值的第一个元素是O(N),但在序列上迭代两次。在可能的情况下,您应该以单程方式使用LINQ。与聚合版本相比,阅读和理解要简单得多,并且每个元素只计算一次投影

萧十郎

这需要一个排序(O(N)原木但非常简单和灵活。另一个优势是能够与LINQtoSQL一起使用它:var&nbsp;maxObject&nbsp;=&nbsp;list.OrderByDescending(item&nbsp;=>&nbsp;item.Height).First();注意,这具有枚举list只重复一次。虽然这可能并不重要list是List<T>在此期间,这一点并没有改变,这可能是武断的事。IEnumerable<T>物品。没有什么能保证序列不会在不同的枚举中发生变化,因此多次执行的方法可能是危险的(而且效率很低,取决于序列的性质)。然而,对于大序列,它仍然是一个不太理想的解决方案。我建议你自己写MaxObject如果有大量的项可以在一次传递中完成,而不需要排序和其他任何内容,则可以手动扩展(O(N):static&nbsp;class&nbsp;EnumerableExtensions&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;T&nbsp;MaxObject<T,U>(this&nbsp;IEnumerable<T>&nbsp;source,&nbsp;Func<T,U>&nbsp;selector) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;U&nbsp;:&nbsp;IComparable<U>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(source&nbsp;==&nbsp;null)&nbsp;throw&nbsp;new&nbsp;ArgumentNullException("source"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;first&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;maxObj&nbsp;=&nbsp;default(T); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U&nbsp;maxKey&nbsp;=&nbsp;default(U); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;item&nbsp;in&nbsp;source)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(first)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxObj&nbsp;=&nbsp;item; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxKey&nbsp;=&nbsp;selector(maxObj); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U&nbsp;currentKey&nbsp;=&nbsp;selector(item); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(currentKey.CompareTo(maxKey)&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxKey&nbsp;=&nbsp;currentKey; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxObj&nbsp;=&nbsp;item; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(first)&nbsp;throw&nbsp;new&nbsp;InvalidOperationException("Sequence&nbsp;is&nbsp;empty."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;maxObj; &nbsp;&nbsp;&nbsp;&nbsp;}}并与以下内容一起使用:var&nbsp;maxObject&nbsp;=&nbsp;list.MaxObject(item&nbsp;=>&nbsp;item.Height);
打开App,查看更多内容
随时随地看视频慕课网APP