4

当我设置默认值(如果集合为空)并.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?

4

7 回答 7

12

您似乎误解了如何DefaultIfEmpty工作。

list.DefaultIfEmpty(1)1如果源集合 ( list) 为空,则返回一个单例序列。因为list不为空,所以这不起作用并返回源序列。

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

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

如果不满足条件,则默认int0soFirstOrDefault返回,因为不包含大于 5 的元素。0list

您可以使用以下方式获得您想要的行为:

int result = list.Cast<int?>().FirstOrDefault(i => i > 5) ?? 1;
于 2013-07-17T17:24:16.250 回答
9

这就是您要查找的内容:

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

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

于 2013-07-17T17:25:45.180 回答
1

整数的默认值为0

FirstOrDefault返回第一个 occurrency 或默认值,在您的情况下,您正在使用int,所以,它是0. 如果您想在没有项目时出现异常,请尝试使用First(x => x > 5).

于 2013-07-17T17:22:42.760 回答
1

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

于 2013-07-17T17:23:01.857 回答
1

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

于 2013-07-17T17:23:17.013 回答
1

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

于 2013-07-17T17:23:52.573 回答
0

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

于 2013-07-17T17:25:10.673 回答