FirstOrDefault返回意外值

Nic*_*tch 4 .net c# linq

如果我设置了一个默认值,如果该组为空并且调用.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)返回包含1source collection(list)为空的单例序列.由于list不为空,因此无效并返回源序列.

因此,您的查询实际上与以下内容相同:

int result = list.FirstOrDefault(i => i > 5);
Run Code Online (Sandbox Code Playgroud)

如果不满足条件,则默认int值为0so FirstOrDefault返回0,因为不list包含大于5的元素.

您可以使用以下方法获得所需的行为:

int result = list.Cast<int?>().FirstOrDefault(i => i > 5) ?? 1;
Run Code Online (Sandbox Code Playgroud)


Sim*_*ger 9

这就是你要找的东西:

Console.WriteLine(list.Where(i => i > 5).DefaultIfEmpty(1).First());
Run Code Online (Sandbox Code Playgroud)

通过放置Where之前的DefaultIfEmpty空集合,将返回带有一个项目的可枚举.然后,您可以使用它First来获取该元素.