FirstOrDefault返回意外值

本文关键字:意外 返回 FirstOrDefault | 更新日期: 2023-09-27 18:22:48

当我设置默认值时,如果该集为空,并在不满足条件的情况下调用.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??

由于我将.DefaultIfEmpty()设置为1,因此这似乎是不直观的。为什么不输出1?

FirstOrDefault返回意外值

您似乎误解了DefaultIfEmpty的工作原理。

如果源集合(list)为空,则list.DefaultIfEmpty(1)返回包含1的单例序列。由于list不为空,因此这没有任何作用,并且返回源序列。

因此,您的查询实际上与相同

int result = list.FirstOrDefault(i => i > 5);

int的默认值是0,因此如果条件不满足,FirstOrDefault将返回0,但事实并非如此,因为list不包含大于5的元素。

你可以使用获得你想要的行为

int result = list.Cast<int?>().FirstOrDefault(i => i > 5) ?? 1;

这就是您想要的:

Console.WriteLine(list.Where(i => i > 5).DefaultIfEmpty(1).First());

通过将Where放在DefaultIfEmpty之前,空集合将返回一个包含一个项的可枚举对象。然后可以使用First来获取该元素。

整数的默认值为0

FirstOrDefault返回第一次出现或默认值,在您的情况下,您正在使用int,因此,它是0。如果您希望在没有项目时出现异常,请尝试使用First(x => x > 5)

FirstOrDefault是指表达式default(T)的值,其中T是集合的类型,而不是列表的第一个值。您不能更改这种行为,也不能更改类型的默认值。

FirstOrDefault()返回一个int,int不可为null,因此默认值为0。查看MSDN上的默认值表http://msdn.microsoft.com/en-us/library/83fhsxwc(v=vs.80).aspx

不可为null的int的默认值为0。由于列表中没有大于5的内容,因此它将返回默认值。

DefaultIfEmpty不设置默认值。如果原始列表为空,它会为您提供一个默认值为该值的列表。