2009-02-10 61 views

回答

6

你的解決方法是一個很好的解決方法。爲什麼不寫一個與Sum類似的IEnumerable的擴展方法,就像SumOrDefault一樣。然後,您可以重新使用您的擴展方法,而不必查看解決方法。

您的擴展方法將非常簡單,只需使用您的解決方法中的確切代碼即可。

2

這實際上是一個很好的方法。我認爲更好的問題是爲什麼它開始時是空的?除非您調用總和的實體爲空,否則查詢應始終返回0.這可能是一個更好的解決方案,以查看實體在開始時是否有效,而不是強制總和始終返回0 - 空值有一個問題。

1

這個問題應該是0還是null是一個棘手的問題。這取決於你對「總和」的理解。如果它是「所有(所選)記錄的總和」,當任何記錄包含NULL時,null將是適當的,因爲你在技術上不確定。如果它意味着「所有已知(選定)記錄的總和」,則它應該返回0.

哪一個適合您的情況只有您可以決定,所以我認爲您在這裏所做的不是一個錯誤的解決方案在所有。

有關NULL的thornyness更多信息,請閱讀一些克里斯日期的和休·達爾文的著作的主題。

+0

你說得對。迴歸0的問題在於,這會要求任何可累加對象具有一個奇怪的中性元素,因爲我可以寫一個+ b而沒有一個。 – Dario 2009-05-19 17:42:19

1

寫一個擴展方法:

public static Decimal? CorrectSum<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector) 
{ 
    Decimal? sum = null; 
    foreach (TSource s in source) 
    { 
     Decimal? val = selector(s); 

     if (val.HasValue == true) 
     { 
      sum = (sum ?? 0) + val; 
     } 
    } 

    return sum; 
}