在这里显示的关于空条件运算符的示例(在许多其他网站上)中,它声明:
int? first = customers?[0].Orders.Count(); 可用于获取第一个客户的计数。但是,此语句不检查集合中是否存在客户,并且可以将索引抛出范围异常。什么应该是正确的(最好是单行)语句,负责检查元素的存在?
发布于 2015-10-26 09:33:40
null条件运算符用于有条件地访问null的,但这不是您遇到的问题。
您正在尝试访问空数组。您可以将其转换为使用FirstOrDefault访问null的情况,并在此上使用操作符:
int? first = customers.FirstOrDefault()?.Orders.Count(); 如果数组不是空的,它将对第一个项进行操作,如果它是空的,FirstOrDefault将返回由空条件运算符处理的null。
编辑:正如注释中提到的那样,如果您正在寻找比第一个项目更多的项目,则可以使用ElementAtOrDefault而不是FirstOrDefault
发布于 2015-10-26 09:17:28
您可以使用LINQ的DefaultIfEmpty,如果查询的集合为空,它将生成一个单例IEnumerable:
int? first = customers?.DefaultIfEmpty().First().Orders.Count();或者如果您想使用索引:
int? first = customers?.DefaultIfEmpty().ToArray()[0].Orders.Count();发布于 2015-10-26 09:39:58
如果我正确理解了这个问题,您会问是否有一种内置(或简洁)的方法来防范IndexOutOfRangeException。
myArray?.Length > 42 ? myArray[42] : null或者是@w.b。前面提到的,利用ElementAtOrDefault:
myArray?.ElementAtOrDefault(42) 这两种方法都可以防止NullReferenceException和IndexOutOfRangeException的发生。
https://stackoverflow.com/questions/33342013
复制相似问题