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

Mar*_*ark 2 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>())
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 9

你有错了地方的空合并运算符-目前你打电话Wherepayment.NewInvoiceModels无条件地,然后检查结果是否将是空的......它永远会(Where根本没有返回null).你可能想要:

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

就个人而言,我会解除这个:

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

foreach (var pmt in allModels.Where(x => x.PaymentReceived != 0))
Run Code Online (Sandbox Code Playgroud)

或者可能会引入一种扩展方法:

public static IEnumerable<T> NullToEmpty(this IEnumerable<T> source)
{
    return source ?? Enumerable.Empty<T>();
}
Run Code Online (Sandbox Code Playgroud)

然后:

foreach (var pmt in payment.NewInvoiceViewModels
                           .NullToEmpty()
                           .Where(x => x.PaymentReceived != 0))
Run Code Online (Sandbox Code Playgroud)