【发布时间】:2010-10-29 04:26:04
【问题描述】:
我有一个带有 Nullable DateOfBirth 属性的 Person 对象。有没有一种方法可以使用 LINQ 查询 Person 对象列表中具有最早/最小 DateOfBirth 值的对象?
这是我开始的:
var firstBornDate = People.Min(p => p.DateOfBirth.GetValueOrDefault(DateTime.MaxValue));
将 Null DateOfBirth 值设置为 DateTime.MaxValue 以便将它们排除在 Min 考虑之外(假设至少有一个具有指定的出生日期)。
但我所做的只是将 firstBornDate 设置为 DateTime 值。我想得到的是与之匹配的 Person 对象。我是否需要像这样编写第二个查询:
var firstBorn = People.Single(p=> (p.DateOfBirth ?? DateTime.MaxValue) == firstBornDate);
或者有更精简的方法吗?
【问题讨论】:
-
只是对您的示例的评论:您可能不应该在这里使用 Single 。如果两个人的出生日期相同,它会抛出一个异常
-
另见几乎重复的stackoverflow.com/questions/2736236/…,其中有一些简洁的例子。
-
多么简单实用的功能。 MinBy 应该在标准库中。我们应该向 Microsoft github.com/dotnet/corefx 提交拉取请求
-
今天似乎确实存在,只需提供一个函数来选择属性:
a.Min(x => x.foo); -
为了演示问题:在 Python 中,
max("find a word of maximal length in this sentence".split(), key=len)返回字符串 'sentence'。在 C# 中,"find a word of maximal length in this sentence".Split().Max(word => word.Length)计算出 8 是任何单词的最长长度,但不会告诉你最长的单词 是什么。