如何让LINQ返回具有给定属性最大值的对象?
问题的出现原因是需要在LINQ中找到具有最大值的属性的对象。在给定的代码中,使用Max方法找到items集合中ID属性的最大值,然后使用First方法找到具有该最大值的对象。
解决方法是使用Max方法找到属性的最大值,然后使用First方法找到具有该最大值的对象。这个方法适用于items集合中存在元素的情况。
代码如下:
int max = items.Max(i => i.ID); var item = items.First(x => x.ID == max);
这个解决方法的优点是清晰易读,不需要引用新的库或扩展。但缺点是在第一个调用Max方法时,会完全遍历整个列表。然后在调用First方法时,会再次遍历列表以找到符合条件的元素。
如果列表不是太大,并且只需要使用这个功能一次,那么这个解决方法是一个不错的选择。但如果需要多次使用或处理大型列表,可能需要考虑使用更高效的方式,比如引用外部库(例如morelinq)或使用其他LINQ扩展方法。
问题的出现原因是希望通过LINQ获取具有给定属性的最大值的对象。解决方法是使用.OrderByDescending(i=>i.id).First()
来按给定属性降序排序,并返回第一个对象。
该方法虽然在理论上比线性方法慢,但实际上,在大多数情况下,我们处理的数据集不足以产生任何差异,因此性能不是主要关注点。如果性能是主要关注点,则可以考虑使用Seattle Leonard的答案,该答案具有线性时间复杂度。此外,您还可以考虑从具有常数时间返回最大值项的不同数据结构开始。
First()
与Take(1)
相同,但返回的是直接的项,而不是包含项的枚举。
虽然.OrderByDescending(i=>i.id).First()
能返回对象本身,而不是包含1个项的枚举,但它是nlogn时间复杂度,而不是线性时间。
tzaman表示,理论上,LINQ系统可以识别"orderby().take()"模式并使用线性时间算法,但实际上可能并没有这样做。
+1,因为这是清晰的答案和高效的答案之间的最佳结合,不需要添加其他依赖。
虽然.FirstOrDefault()
是一个更好的选择,因为它更不容易出现问题,但这个问题已经很老了。
什么问题?我总是在可能的情况下选择First()而不是FirstOrDefault()。
如果没有返回元素,它会抛出无效操作异常。把它想象成使用TryParse和普通强制转换的区别。这样更安全。
如果那是一个有效的错误,那就是不安全的相反。应该让每个人都知道这一点。"错误隐藏"是一种坏习惯(反模式)。我偶尔仍然使用FirstOrDefault(),当我期望一个元素时,但只是为了能够生成比默认更详细的异常消息。
这有点愚蠢。它是关于优雅地失败。FirstOrDefault()做的事情完全相同,只是你可以处理坏数据或异常。First()会痛苦地中断,并且如果你处理大量信息,就会有很多错误的空间。这对任何实际应用程序都是正确的。
不,我们的理解是一致的。FirstOrDefault()本身并不能解决任何问题。
我编辑了这个回答以反映你的说法。否则,在几种不同的上下文中,它会出现错误。
.First不接受整数参数,它不接受参数或者接受用于查找满足特定条件的第一个项的谓词。你的意思应该是使用Take(1)而不是First()。