LINQ与NULL处理的字符串比较

时间:2018-06-15 02:19:06

标签: c# linq string-comparison

我正在使用这样的LINQ表达式

Attention attention = debtor_response.DebtorEntry
                .Address.AttentionList.Where(p => p.JobTitle.ToLower() == "valuetocheck")
                .FirstOrDefault();

这在正常情况下确实有效。但在某些情况下,它会返回异常

 Value cannot be null.\r\nParameter name: source 

我想到的可能原因是

在某些情况下,JobTitle可能为null

那么如何才能在上面的LINQ中正确处理这个问题并摆脱异常

1 个答案:

答案 0 :(得分:6)

我怀疑AttentionList为空,因为method signature for Enumerable.Where是:

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

您的错误表示名为source的参数为null,与this extension method throws匹配:

  

异常:ArgumentNullException
  条件:source或predicate为null。

尝试将代码更改为以下内容:

Attention attention = debtor_response.DebtorEntry
    .Address
    .AttentionList?.Where(p => p.JobTitle.ToLower() == "valuetocheck")
               // ↑
    .FirstOrDefault();

注意第3行添加了??如果AttentionList为空,Null-conditional Operator将无法调用Where

我是如何得出这个结论的

你得到一个ArgumentNullException,但你只有三个函数调用:

Enumerable.Where          (extension)
Enumerable.FirstOrDefault (extension)
String.ToLower

ToLower没有任何参数,因此可以排除它。如果JobTitle为空,您将获得NullReferenceException

两种扩展方法都有一个名为source的参数。但是,Where首先被调用,并且不能将空值返回给FirstOrDefault。所以罪魁祸首必须是Enumerable.Where。它的source参数为null,该参数为AttentionList