3

目前我正在返回一个项目列表,所有项目都有一个日期范围。有些约会已经过期,有些还没有发生。我正在显示尚未过期的约会。但我想检查是否所有约会都已过期,然后显示第一项。

var curApt = myAppts.Where(d => d.Appt.EndTime > DateTime.UtcNow).First();

如果myAppts.Where(d => d.Appt.EndTime > DateTime.UtcNow) == null

var curApt = myAppts.First();

我该如何构建这个,以便我考虑这两种情况?

4

4 回答 4

4

FirstOrDefault空合并运算符 ( ??)

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow)
             ?? myAppts.First();

但是,如果您有一个默认值来显示是否根本没有约会,您可以使这种异常更不容易发生,您可以为此链接 null 合并运算符:

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow)
             ?? myAppts.FirstOrDefault() ?? yourDefault;
于 2013-08-07T20:12:51.713 回答
2

您可以使用以下FirstOrDefault方法:

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow);

查找未过期的第一个,或者null是否所有约会都已过期。因此,在这种情况下,要将其默认为第一次约会,您可以使用以下命令:

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow);
if (curApt == null) 
{
    curApt = myAppts.First();
}

或者,为了简洁起见,您可以使用空合并运算符 ( ??)

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow)
          ?? myAppts.First();
于 2013-08-07T20:13:28.430 回答
1

听起来你想在.FirstOrDefault()这里使用:

var curApt = myAppts.Where(d => d.Appt.EndTime > DateTime.UtcNow).FirstOrDefault();
if (curApt == null) {
    // no expirations
    curApt = myAppts.First();
}
于 2013-08-07T20:13:15.523 回答
1

使用 FirstOrDefault() 而不是 First(),并在第一条语句之后检查 curApt 是否为空,如果是,则执行第二条语句。

于 2013-08-07T20:13:34.053 回答