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

C# 6 null conditional operator check for .Any()?

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

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

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

您可以使用 LINQ 的 DefaultIfEmpty,如果查询的集合为空,它将产生一个单例 IEnumerable

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

或者如果你想使用索引:

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

空条件运算符用于有条件地访问null,但这不是您遇到的问题。

您正在尝试访问一个空数组。您可以将其转换为使用 FirstOrDefault 访问 null 的情况,并在其上使用运算符:

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

如果数组不为空,它将对第一项进行操作,如果数组为空,FirstOrDefault 将对 return null 进行操作,这将由 null 条件运算符处理.

编辑:正如 w.b 在评论中提到的,如果您要寻找的不是第一个项目,您可以使用 ElementAtOrDefault 而不是 FirstOrDefault

如果我对问题的理解正确,你是在问是否有内置(或简洁)的方法来防止 IndexOutOfRangeExceptions。最接近它的是:

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

或@w.b。提到,使用 ElementAtOrDefault:

myArray?.ElementAtOrDefault(42) 

两者都可以防止 NullReferenceException 以及 IndexOutOfRangeException