如果我设置了一个默认值,如果该组为空并且调用.FirstOrDefault()
了一个不满足的条件,我没有得到我的默认值,但是类型的默认值:
int[] list = { 1, 2, 3, 4, 5 };
Console.WriteLine(list.DefaultIfEmpty(1).FirstOrDefault(i => i == 4)); // Outputs 4, as expected
Console.WriteLine(list.DefaultIfEmpty(1).FirstOrDefault(i => i > 5)); // Outputs 0, why??
Run Code Online (Sandbox Code Playgroud)
这似乎不直观,因为我设置.DefaultIfEmpty()
为1.为什么这不输出1?
Lee*_*Lee 12
你似乎误解了它是如何DefaultIfEmpty
运作的.
list.DefaultIfEmpty(1)
返回包含1
source collection(list
)为空的单例序列.由于list
不为空,因此无效并返回源序列.
因此,您的查询实际上与以下内容相同:
int result = list.FirstOrDefault(i => i > 5);
Run Code Online (Sandbox Code Playgroud)
如果不满足条件,则默认int
值为0
so FirstOrDefault
返回0
,因为不list
包含大于5的元素.
您可以使用以下方法获得所需的行为:
int result = list.Cast<int?>().FirstOrDefault(i => i > 5) ?? 1;
Run Code Online (Sandbox Code Playgroud)
这就是你要找的东西:
Console.WriteLine(list.Where(i => i > 5).DefaultIfEmpty(1).First());
Run Code Online (Sandbox Code Playgroud)
通过放置Where
之前的DefaultIfEmpty
空集合,将返回带有一个项目的可枚举.然后,您可以使用它First
来获取该元素.