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
如果我对问题的理解正确,你是在问是否有内置(或简洁)的方法来防止 IndexOutOfRangeException
s。最接近它的是:
myArray?.Length > 42 ? myArray[42] : null
或@w.b。提到,使用 ElementAtOrDefault:
myArray?.ElementAtOrDefault(42)
两者都可以防止 NullReferenceException
以及 IndexOutOfRangeException
。
在此处显示的示例 (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
如果我对问题的理解正确,你是在问是否有内置(或简洁)的方法来防止 IndexOutOfRangeException
s。最接近它的是:
myArray?.Length > 42 ? myArray[42] : null
或@w.b。提到,使用 ElementAtOrDefault:
myArray?.ElementAtOrDefault(42)
两者都可以防止 NullReferenceException
以及 IndexOutOfRangeException
。