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

如何使用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);

还是有一种更精简的方法?


牧羊人nacy
浏览 1407回答 3
3回答

达令说

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

aluckdog

注意:为了完整起见,我包含了这个答案,因为OP没有提到数据源是什么,我们不应该做任何假设。这个查询给出了正确的答案,但是可能更慢因为它可能需要排序全中的项目People,取决于数据结构People是:var&nbsp;oldest&nbsp;=&nbsp;People.OrderBy(p&nbsp;=>&nbsp;p.DateOfBirth&nbsp;??&nbsp;DateTime.MaxValue).First();更新:实际上我不应该把这个解决方案称为“天真”,但是用户确实需要知道他在查询什么。这个解决方案的“慢度”取决于底层数据。如果这是一个数组或者List<T>,则LINQto对象别无选择,只能在选择第一项之前先对整个集合进行排序。在这种情况下,它将比建议的其他解决方案慢。但是,如果这是一个LINQtoSQL表,并且DateOfBirth是索引列,则SQLServer将使用索引而不是对所有行进行排序。其他习俗IEnumerable<T>实现也可以使用索引(请参阅i4o:索引LINQ,或对象数据库。db4o)并使此解决方案比Aggregate()或MaxBy()/MinBy()它需要迭代整个集合一次。事实上,LINQto对象(理论上)可以在OrderBy()对于排序的集合,如SortedList<T>但据我所知没有。
打开App,查看更多内容
随时随地看视频慕课网APP