Linq FirstOrDefault - 一个班轮

Byy*_*yyo 4 c# linq c#-4.0

我有以下代码来确定a的年龄 Person

var pList = ctx.Person.Where(x => x.Create > Date);
int Age = pList.Where(x => x.ID == "foo").FirstOrDefault().Age ?? 20;
Run Code Online (Sandbox Code Playgroud)

我选择一个PersonID,如果它不存在,则默认值为20.

第二行无效,因为Age不能为null但是Person可以.有没有办法让这个工作在一条线上?我尝试过使用DefaultIfEmpty,但似乎没有用.

Tim*_*ter 16

你可以使用重载Enumerable.DefaultIfEmpty:

int Age = pList
    .Where(x => x.ID == "foo")
    .Select(x => x.Age)
    .DefaultIfEmpty(20)
    .First();
Run Code Online (Sandbox Code Playgroud)

如您所见,FirstOrdefault不再需要,因为如果输入序列为空(如果id-filter没有返回任何人),则采用默认值.

  • 回答OP问题的线程中的唯一答案(包括单行和C#版本的要求) (3认同)

Gha*_*san 5

int Age = pList.Where(x => x.ID == "foo").FirstOrDefault()?.Age ?? 20;
Run Code Online (Sandbox Code Playgroud)

仅限于C#6.

对于那些怀疑的人: 在此输入图像描述

  • @rmorrin null条件运算符(`?.Age`)将返回类型更改为`int?`,因此以下`??`工作正常. (3认同)