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?
您似乎误解了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的内容,因此它将返回默认值。