c# - LINQ 字符串比较与 NULL 处理
问题描述
我正在使用这样的 LINQ 表达式
Attention attention = debtor_response.DebtorEntry
.Address.AttentionList.Where(p => p.JobTitle.ToLower() == "valuetocheck")
.FirstOrDefault();
这在正常情况下确实有效。但在某些情况下,它会返回异常
Value cannot be null.\r\nParameter name: source
我认为可能的原因是
JobTitle 在某些情况下可能为空
那么我怎样才能在上面的 LINQ 中正确处理这个并摆脱异常
解决方案
我怀疑AttentionList
是空的,因为方法签名Enumerable.Where
是:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source, <-------
Func<TSource, bool> predicate
)
您的错误表明名为source
null的参数与此扩展方法抛出的内容相匹配:
异常:ArgumentNullException
条件:源或谓词为空。
尝试将您的代码更改为以下内容:
Attention attention = debtor_response.DebtorEntry
.Address
.AttentionList?.Where(p => p.JobTitle.ToLower() == "valuetocheck")
// ↑
.FirstOrDefault();
注意第?
3 行添加的内容?如果AttentionList
为 null,则Null 条件运算符将避免调用Where
我是怎么得出这个结论的
你得到一个ArgumentNullException
,但你只有三个函数调用:
Enumerable.Where (extension)
Enumerable.FirstOrDefault (extension)
String.ToLower
ToLower
没有任何参数,所以可以排除。如果JobTitle
为空,你会得到一个NullReferenceException
.
两种扩展方法都有一个名为source
. 但是,Where
首先调用并且不能将空值返回给FirstOrDefault
. 所以罪魁祸首一定是Enumerable.Where
。它的source
参数为空,该参数为AttentionList
.