FirstOrDefault返回意外值

时间:2013-07-17 17:21:17

标签: c# .net 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??

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

7 个答案:

答案 0 :(得分:12)

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

如果源集合(list.DefaultIfEmpty(1))为空,则

1返回包含list的单例序列。由于list不为空,因此无效并返回源序列。

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

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

默认int0,因此FirstOrDefault如果条件不满足则返回0,因为list不包含任何元素比5。

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

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

答案 1 :(得分:9)

这就是你要找的东西:

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

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

答案 2 :(得分:1)

整数的默认值为0

FirstOrDefault返回第一个并发或默认值,在您的情况下,您使用int,因此,它是0。如果您在没有项目时想要例外,请尝试使用First(x => x > 5)

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

非可空int的默认值为0.因为列表中没有任何内容是&gt; 5,它返回默认值。

答案 6 :(得分:0)

DefaultIfEmpty未设置默认值。如果原始列表为空,它会为您提供一个列表,其中包含一个默认值。