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

在这里展示的例子(以及其他许多网站)中,关于空条件运算符,它指出这一点

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

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


null条件运算符旨在有条件地访问null但这不是您遇到的问题。

您正试图访问一个空数组 。 您可以将其转化为FirstOrDefault访问null的情况,并使用该操作符:

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

如果数组不为空,它将在第一个项上操作,如果它为空,则FirstOrDefault将返回null ,这将由null条件运算符处理。

编辑:正如wb在评论中提到的,如果你正在寻找另一个项目,而不是第一个项目,你可以使用ElementAtOrDefault而不是FirstOrDefault


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

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

或者如果你想使用索引:

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

如果我正确地理解了这个问题,那么您是在问是否有内置(或简明)的方法来防范IndexOutOfRangeException 。 最近你会得到它会是这样的:

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

或者如@wb所述,利用ElementAtOrDefault:

myArray?.ElementAtOrDefault(42) 

这两者都可以防止NullReferenceException以及IndexOutOfRangeException

链接地址: http://www.djcxy.com/p/75179.html

上一篇: C# 6 null conditional operator check for .Any()?

下一篇: Remove empty array elements