【问题标题】:C# Generic List.Any() throws System.NullReferenceExceptionC# 通用 List.Any() 抛出 System.NullReferenceException
【发布时间】:2013-01-16 15:14:38
【问题描述】:

考虑下面的部分视图代码sn-p

List<sellingPrice> Prices = ViewBag.Prices;
foreach (var mgmp in mg.messageGroup.messageGroupMessagePLUs)
{
    if (Prices.Any(x => x.pluId == mgmp.messagePLU.plu.pluId))
    {
        //do stuff
    }
}

对于数据库中的特定产品,行

if (Prices.Any(x => x.pluId == mgmp.messagePLU.plu.pluId))

抛出 System.NullReferenceException。检查代码显示 mgmp 一个对象并且 Price 包含元素。但是,x 的值为空。现在,我的印象是我只是在测试是否存在任何满足我测试的“x”,而不是要求它返回一个“x”。

这是一个非常烦人的问题。希望有人能指出真正明显的解决方案。

【问题讨论】:

    标签: linq entity-framework c#-4.0 generic-list


    【解决方案1】:

    试试:

    Prices.Any(x => x!=null && x.pluId == mgmp.messagePLU.plu.pluId)
    

    如果 .messagePLU 可以为空,您可能需要进行其他空检查

    【讨论】:

    • 成功了。谢谢。我认为在我的情况下没有必要在我的价格集合中测试空值。嗯,你生活和学习。
    • 需要注意的是,这可能仅适用于保证订单的 linq-to-objects。我不是 100% 确定,但认为 linq-to-SQL 可能无法正确短路。
    • 我们到达那里时会越过那座桥。
    • 您现在可以使用空传播,例如(x?.pluId == mgmp.messagePLU?.plu.pluId)
    【解决方案2】:

    发生这种情况的最可能原因是ViewBag.Prices 中的一项或多项是null。检查x 中的null,或者看看为什么价格首先包含nulls,假设它不应该有任何null 值。

    【讨论】:

      【解决方案3】:

      感谢大家的推理。 即使 List 为空,也可以检查 list.Any() any 的扩展。

          /// <summary>
          /// Determines whether the collection is null or contains no elements.
          /// </summary>
          /// <typeparam name="T">The IEnumerable type.</typeparam>
          /// <param name="enumerable">The enumerable, which may be null or empty.</param>
          /// <returns>
          ///     <c>true</c> if the IEnumerable is null or empty; otherwise, <c>false</c>.
          /// </returns>
          public static bool IsNullOrEmpty<T>(this ICollection<T> enumerable)
          {
              return enumerable != null && enumerable.Count > 0;
          }
      

      【讨论】:

        猜你喜欢
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多