c# - 在遍历对象之前检查对象是否为空

标签 c# asp.net asp.net-mvc

我在以下方面收到错误 System.ArgumentNullException: Value cannot be null.:

 foreach (var pmt in payment.NewInvoiceViewModels
   .Where(x => x.PaymentReceived != 0) ?? 
    Enumerable.Empty<NewInvoiceViewModel>())

我要做的只是检查付款。在我迭代它之前,NewInvoiceViewModels 为 null(如果它为 null,则会导致错误)。

有没有更好的方法来实现这一点?

最佳答案

您在错误的位置使用了空合并运算符 - 当前您正在无条件地调用 payment.NewInvoiceModels 上的 Where,然后检查结果是否为null...它永远 将是(Where 根本不返回 null)。您可能想要:

foreach (var pmt in (payment.NewInvoiceViewModels ?? 
                     Enumerable.Empty<NewInvoiceViewModel>())
                   .Where(x => x.PaymentReceived != 0))

不过我个人还是会提取这个:

var allModels = payment.NewInvoiceViewModels ?? 
                     Enumerable.Empty<NewInvoiceViewModel>();

foreach (var pmt in allModels.Where(x => x.PaymentReceived != 0))

或者也许引入一个扩展方法:

public static IEnumerable<T> NullToEmpty(this IEnumerable<T> source)
{
    return source ?? Enumerable.Empty<T>();
}

然后:

foreach (var pmt in payment.NewInvoiceViewModels
                           .NullToEmpty()
                           .Where(x => x.PaymentReceived != 0))

关于c# - 在遍历对象之前检查对象是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19029769/

相关文章:

在页面代码后面的 Page_Load 上引用 ASP.NET 用户控件实例时为空

asp.net-mvc - ASP.Net MVC 显示格式

Javascript Jtable 单击两次时关闭子表

c# - 验证文化中的十进制数字

c# - 是否有在基于 DDD 的分层架构中的模型和数据访问层之间使用 LINQ 的建议模式

c# - 以编程方式使用 C# 和 LINQ 进行分组(可能是 OnSelecting?)

c# - 使用 PagedList 对产品列表进行分页

c# - 如何在 Windows Phone 8.1 通用应用程序中创建 CycleTile

c# - 需要向日期添加天数,但从日历中排除某些天

asp.net - 阻止跨域调用 asp.net .asmx Web 服务