2015-10-26 13 views
4

与问候空,条件运算符这里()所示的例子,它指出C#6 null条件运算符检查.Any()?

int? first = customers?[0].Orders.Count(); 

可以用来获得第一个客户的计数。但是这个陈述并没有检查集合中是否存在客户,并且可以抛出索引超出范围的异常。什么应该是正确的(最好是单线的)声明,负责检查元素的存在?

+1

猜测,客户?检查icustomers数组是否为空或不是,在你的情况下它不是,但客户数组是空的。所以你没有索引0 – adt

+1

和订单上的任何元素?如果订单为NULL则出错。你必须使用:int? first = customers?[0] .Orders?.Count(); –

回答

5

空条件运算符旨在用于有条件地访问null但这不是您遇到的问题。您正尝试访问空数组。你可以把它转换成访问的情况下,空与FirstOrDefault和使用上的操作员:

int? first = customers.FirstOrDefault()?.Orders.Count(); 

如果数组不为空,将在第一项工作,如果是空的FirstOrDefault将返回null这将由空条件运算符处理。

编辑:正如在评论中提到世行,如果你正在寻找比第一个。如果我理解正确的问题,你可以使用ElementAtOrDefault代替FirstOrDefault

+0

以及订单为空的情况如何? –

+0

@Meehow这不是OP询问的问题。但如果是这样的话,那么只需使用条件访问操作符即可 – i3arnon

+1

谢谢你的明确解释! – JohnC

2

您可以使用LINQ的DefaultIfEmpty,它会产生一个单IEnumerable的情况下,查询的集合为空:

int? first = customers?.DefaultIfEmpty().First().Orders.Count(); 

,或者如果你想使用索引:

int? first = customers?.DefaultIfEmpty().ToArray()[0].Orders.Count(); 
0

另一个项目,你是问,如果有一个内置(或简洁)的方式来防止IndexOutOfRangeException s。最近你会得到它会是这样的:

myArray?.Length > 42 ? myArray[42] : null 

或作为@ w.b。提及,利用ElementAtOrDefault:

myArray?.ElementAtOrDefault(42) 

这两个将防止NullReferenceException以及IndexOutOfRangeException

+0

我会说'FirstOrDefault'内置简洁。 – i3arnon

+0

@ l3arnon只有当你之后的索引是0.如果它是42呢? –

+1

@ErenErsönmez - 有'ElementAtOrDefault' –