与问候空,条件运算符这里()所示的例子,它指出C#6 null条件运算符检查.Any()?
int? first = customers?[0].Orders.Count();
可以用来获得第一个客户的计数。但是这个陈述并没有检查集合中是否存在客户,并且可以抛出索引超出范围的异常。什么应该是正确的(最好是单线的)声明,负责检查元素的存在?
与问候空,条件运算符这里()所示的例子,它指出C#6 null条件运算符检查.Any()?
int? first = customers?[0].Orders.Count();
可以用来获得第一个客户的计数。但是这个陈述并没有检查集合中是否存在客户,并且可以抛出索引超出范围的异常。什么应该是正确的(最好是单线的)声明,负责检查元素的存在?
空条件运算符旨在用于有条件地访问null
但这不是您遇到的问题。您正尝试访问空数组。你可以把它转换成访问的情况下,空与FirstOrDefault
和使用上的操作员:
int? first = customers.FirstOrDefault()?.Orders.Count();
如果数组不为空,将在第一项工作,如果是空的FirstOrDefault
将返回null
这将由空条件运算符处理。
编辑:正如在评论中提到世行,如果你正在寻找比第一个。如果我理解正确的问题,你可以使用ElementAtOrDefault
代替FirstOrDefault
您可以使用LINQ的DefaultIfEmpty
,它会产生一个单IEnumerable
的情况下,查询的集合为空:
int? first = customers?.DefaultIfEmpty().First().Orders.Count();
,或者如果你想使用索引:
int? first = customers?.DefaultIfEmpty().ToArray()[0].Orders.Count();
另一个项目,你是问,如果有一个内置(或简洁)的方式来防止IndexOutOfRangeException
s。最近你会得到它会是这样的:
myArray?.Length > 42 ? myArray[42] : null
或作为@ w.b。提及,利用ElementAtOrDefault:
myArray?.ElementAtOrDefault(42)
这两个将防止NullReferenceException
以及IndexOutOfRangeException
。
我会说'FirstOrDefault'内置简洁。 – i3arnon
@ l3arnon只有当你之后的索引是0.如果它是42呢? –
@ErenErsönmez - 有'ElementAtOrDefault' –
猜测,客户?检查icustomers数组是否为空或不是,在你的情况下它不是,但客户数组是空的。所以你没有索引0 – adt
和订单上的任何元素?如果订单为NULL则出错。你必须使用:int? first = customers?[0] .Orders?.Count(); –