【问题标题】:Sum fails on empty listSum 在空列表上失败
【发布时间】:2016-01-21 19:55:31
【问题描述】:

这是我的清单:

var MaxItemCountFromRegItems = RegisteredItems.MyRegisteredItems
                                              .Where(s => s.ItemID == _itemID)
                                              .Sum(s => s.Posted);`

失败并出现错误:

异常:System.ArgumentNullException:值不能为空。

它的明显错误发生是因为集合是空的。我想知道如何避免它。

【问题讨论】:

  • 一定是null
  • 查看答案(如何在源集合为空时强制 LINQ Sum() 返回 0)(stackoverflow.com/questions/17593371/…)
  • 异常不会发生,因为集合是空的。 MyRegisteredItems 是否有可能为空?
  • 您可以使用空合并运算符来确保您有一个非空集合:var myCollection = RegisteredItems.MyRegisteredItems ?? Enumerable.Empty<ClassRegisteredItems>(); myCollection.Where(...)。或者,如果您有权访问公开此集合的代码,则可以确保 MyRegisteredItems 永远不会是 null
  • 您需要检查堆栈跟踪以了解错误来自何处。我的猜测是RegisteredItems.MyRegisteredItems 并且异常是从Where 扩展方法抛出的。

标签: c# linq


【解决方案1】:

使用DefaultIfEmpty:

var MaxItemCountFromRegItems = RegisteredItems.MyRegisteredItems
                               .Where(s => s.ItemID == _itemID)
                               .Select(c=>c.Posted)
                               .DefaultIfEmpty(0).Sum();

【讨论】:

  • 已经试过了,但是:'IEnumerable' 不包含'DefaultIfEmpty'的定义和最佳扩展方法重载'Queryable.DefaultIfEmpty(IQueryable, int)'需要 'IQueryable' 类型的接收器
  • @Tagyoureit...您应该选择一列。检查我更新的答案。
  • 您的解决方案有效,但问题是 MyRegisteredItems 为 Null,所以我仍然收到相同的错误。
  • @Tagyoureit...所以你可能想使用空合并运算符来确保你有一个非空集合,如 cmets 中提到的 Andrew Whitakervar myCollection = RegisteredItems.MyRegisteredItems ?? Enumerable.Empty<ClassRegisteredItems>();
【解决方案2】:

正确答案是:

if(RegisteredItems.MyRegisteredItems != null)
{

var SumOfItems = RegisteredItems.MyRegisteredItems
                               .Where(x => x.ItemID == _itemID)
                               .Select(o=>o.AmountField)
                               .DefaultIfEmpty(0).Sum();
}

【讨论】:

    【解决方案3】:

    试试这个:

    if (registeredItems.MyRegisteredItems != null)
    {
        var maxItemCountFromRegItems = registeredItems.MyRegisteredItems
            .Where(s => s.ItemID == _itemID)
            .Sum(s => s.Posted);    
    }
    

    干杯。

    【讨论】:

    • 废话。这可以防止任何事情。如果列表中没有带有 _itemID 的项目怎么办?你会得到空值,所以会得到你想避免的同样的错误。
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2023-03-30
    • 1970-01-01
    • 2018-01-25
    相关资源
    最近更新 更多