C#6空条件运算符检查.Any()?

时间:2015-10-26 09:09:32

标签: c# c#-6.0

在此处显示的示例(and on numerous other websites)中,关于空条件运算符,它表明

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

可用于获取第一位客户的计数。但是此声明不会检查集合中是否存在客户,并且可能会使索引超出范围异常。什么应该是正确的(最好是单行的)语句,负责检查元素的存在?

3 个答案:

答案 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