首页 > 解决方案 > 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 中正确处理这个并摆脱异常

标签: c#linqstring-comparison

解决方案


我怀疑AttentionList是空的,因为方法签名Enumerable.Where是:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,               <-------
    Func<TSource, bool> predicate
)

您的错误表明名为sourcenull的参数与此扩展方法抛出的内容相匹配:

异常: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.


推荐阅读