为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用LINQ选择具有最小或最大属性值的对象

如何使用LINQ选择具有最小或最大属性值的对象

牧羊人nacy 2019-06-14 16:28:41
如何使用LINQ选择具有最小或最大属性值的对象我有一个Person对象,它具有Nullable DateOfBirth属性。是否有一种方法可以使用LINQ查询具有最早/最小DateOfBirth值的Person对象列表。以下是我开始的想法:var firstBornDate = People.Min(p => p.DateOfBirth.GetValueOrDefault(DateTime.MaxValue));NULL DateOfBirth值被设置为DateTime.MaxValue,以便将它们排除在Min考虑范围之外(假设至少有一个指定的道布)。但是,对我来说,所做的就是将FirstBornDate设置为日期时间值。我想得到的是与之匹配的Person对象。是否需要编写第二个查询,如:var firstBorn = People.Single(p=> (p.DateOfBirth ?? DateTime.MaxValue) == firstBornDate);还是有一种更精简的方法?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

People.Aggregate((curMin, x) => (curMin == null || (x.DateOfBirth ?? DateTime.MaxValue) <
    curMin.DateOfBirth ? x : curMin))


查看完整回答
反对 回复 2019-06-14
?
aluckdog

TA贡献1847条经验 获得超7个赞

注意:为了完整起见,我包含了这个答案,因为OP没有提到数据源是什么,我们不应该做任何假设。

这个查询给出了正确的答案,但是可能更慢因为它可能需要排序中的项目People,取决于数据结构People是:

var oldest = People.OrderBy(p => p.DateOfBirth ?? DateTime.MaxValue).First();

更新:实际上我不应该把这个解决方案称为“天真”,但是用户确实需要知道他在查询什么。这个解决方案的“慢度”取决于底层数据。如果这是一个数组或者List<T>,则LINQto对象别无选择,只能在选择第一项之前先对整个集合进行排序。在这种情况下,它将比建议的其他解决方案慢。但是,如果这是一个LINQtoSQL表,并且DateOfBirth是索引列,则SQLServer将使用索引而不是对所有行进行排序。其他习俗IEnumerable<T>实现也可以使用索引(请参阅i4o:索引LINQ,或对象数据库。db4o)并使此解决方案比Aggregate()MaxBy()/MinBy()它需要迭代整个集合一次。事实上,LINQto对象(理论上)可以在OrderBy()对于排序的集合,如SortedList<T>但据我所知没有。


查看完整回答
反对 回复 2019-06-14
  • 3 回答
  • 0 关注
  • 1405 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信