2009-02-10 62 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; 
}