2

次のエラーが発生System.ArgumentNullException: Value cannot be null.します。

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

私がやろうとしているのは、支払いのチェックです.NewInvoiceViewModelsは、反復する前にnullです(nullの場合、エラーが発生します)。

これを達成するためのより良い方法はありますか?

4

2 に答える 2

9

null 合体演算子が間違った場所にあります。現在、無条件に呼び出しWhereて、結果が null になるかどうかを確認しています...決してnull にはなりません(単に null を返さない)。あなたは潜在的に欲しい:payment.NewInvoiceModelsWhere

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))
于 2013-09-26T13:38:43.890 に答える
3

このようなものが欲しいですか

if(payment.NewInvoiceViewModels!=null)
{
  foreach (var pmt in payment.NewInvoiceViewModels
   .Where(x => x.PaymentReceived != 0) ?? 
    Enumerable.Empty<NewInvoiceViewModel>())
}
于 2013-09-26T13:33:51.227 に答える