在此处显示的示例(and on numerous other websites)中,关于空条件运算符,它表明
int? first = customers?[0].Orders.Count();
可用于获取第一位客户的计数。但是此声明不会检查集合中是否存在客户,并且可能会使索引超出范围异常。什么应该是正确的(最好是单行的)语句,负责检查元素的存在?
答案 0 :(得分:6)
null条件运算符用于有条件地访问null
,但这不是您遇到的问题。
您正在尝试访问空数组。您可以将其转换为使用FirstOrDefault
访问null的情况,并使用运算符:
int? first = customers.FirstOrDefault()?.Orders.Count();
如果数组不是空的,它将对第一个项目进行操作,如果它为空,FirstOrDefault
将返回null
,这将由空条件运算符处理。
修改:正如评论中提到的那样,如果您正在寻找除第一项以外的其他项目,则可以使用ElementAtOrDefault
代替FirstOrDefault
答案 1 :(得分:2)
您可以使用LINQ的DefaultIfEmpty
,如果查询的集合为空,它将产生一个单IEnumerable
:
int? first = customers?.DefaultIfEmpty().First().Orders.Count();
或者如果你想使用索引:
int? first = customers?.DefaultIfEmpty().ToArray()[0].Orders.Count();
答案 2 :(得分:0)
如果我正确理解了这个问题,你会问是否有内置(或简洁)方法来防范IndexOutOfRangeException
。你最接近它的是:
myArray?.Length > 42 ? myArray[42] : null
或@ w.b.提到,利用ElementAtOrDefault:
myArray?.ElementAtOrDefault(42)
这两项措施都可以防范NullReferenceException
以及IndexOutOfRangeException
。