在迭代之前检查对象是否为空

时间:2013-09-26 13:32:18

标签: 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>())

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

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

2 个答案:

答案 0 :(得分:9)

你有一个空合并运算符在错误的位置 - 目前你无条件地在Where上调用payment.NewInvoiceModels,然后检查结果是否为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))

答案 1 :(得分:3)

你想要这样的东西

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