如果我设置了一个默认值,如果该组为空并且调用.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?
答案 0 :(得分:12)
您似乎误解了DefaultIfEmpty
的工作原理。
list.DefaultIfEmpty(1)
)为空,则 1
返回包含list
的单例序列。由于list
不为空,因此无效并返回源序列。
因此,您的查询实际上与以下内容相同:
int result = list.FirstOrDefault(i => i > 5);
默认int
为0
,因此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未设置默认值。如果原始列表为空,它会为您提供一个列表,其中包含一个默认值。