2013-09-26 29 views
2

我在下面收到錯誤System.ArgumentNullException: Value cannot be null.前:檢查的對象是不是空遍歷它

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

所有我想要做的是payment.NewInvoiceViewModels的檢查是空之前,我遍歷它(如果它爲空,則會導致錯誤)。

有沒有更好的方法來實現這一目標?

+0

你方法是正確的。然而,你可以編寫一個通用的擴展方法來改進它。 http://stackoverflow.com/questions/11734380/check-for-null-in-foreach-loop –

+0

嗨Emrie - 謝謝 - 我認爲這是正確的,但如果對象是空的,我得到的值不能爲空錯誤 - 這就是我想要解決的問題。與其他問題的聯繫是我正在做的(我相信)。謝謝,Mark – Mark

+1

@emrenevayeshirazi:不,這種方法目前絕對*不*正確。調用'Enumerable.Where(null,predicate)'會拋出異常 - 就像OP報告一樣。 –

回答

9

你得放錯了地方的空合併運算符 - 目前你正在呼籲payment.NewInvoiceModelsWhere無條件然後檢查結果是否爲空。 ..它從來沒有將(Where根本不返回空)。你可能想:

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)) 
+0

完美 - 謝謝 - 我會盡可能快地標記答案(6分鐘) - 歡呼聲,馬克 – Mark

3

你想是這樣的

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

他正在通過使用Enumerable.Empty ()來處理問題。你的答案顯然更糟。 –

+0

嗨 - 謝謝你 - 我也是這樣刪除:? Enumerable.Empty () - 因爲我認爲這會做什麼?謝謝,馬克 – Mark

+4

@emrenevayeshirazi:沒有。如果'payment.NewInvoiceViewModels'爲null,那麼'Where'會拋出ArgumentNullException。 –