通过select语句防止LINQ组中的0除以

时间:2011-09-08 00:06:12

标签: linq

我有以下LINQ语句:

var result = CommisionDataContext.COMMISSIONS
    .Where(c.PRODUCT == 'Computer')
    .GroupBy(g => new 
        {
            CostCenter = g.COST_CENTER,
            Product = g.PRODUCT,
        }
    .Select(group => new
        {
            Revenue = group.Sum(p => p.REVENUE),
            Volume = group.Sum(p => p.VOLUME),
            Avg = group.Sum(p => p.REVENUE) / group.Sum(p => p.VOLUME),
        });

如何防止可能发生的零除异常,如果确实如此,我只想让Avg等于0。

3 个答案:

答案 0 :(得分:1)

为了避免超出必要的求和,你应该可以做这样的事情(注意你的代码不能编译):

   ...
   .Select(group => new
   {
      Revenue = group.Sum(p => p.REVENUE),
      Volume = group.Sum(p => p.VOLUME)          
   })
   .Select(item => new
   {
      item.Revenue,
      item.Volume,
      Avg = item.Volume == 0 ? 0 : item.Revenue / item.Volume
   });

答案 1 :(得分:1)

请注意,因为C# Double 可以处理 Infinity 值,实际上如果您尝试

        var x = 5.0 / 0.0

你会发现x = Infinity(没有Exception),这与0真的不同!所以,如果你想要你的AVG = 0从数学和代表性的角度来看它是正确的(例如我使用营销公式和图表,重要的是要知道我的AVG是真的0还是近似以避免错误的图表表达和误解)。

无论如何,这个代码避免了除以零异常(你需要将AVG设置为Double)如果你发现有用AVG操作的确切值来处理 Infinity 如果总和为0,则返回值。

Avg = Convert.ToDouble(group.Sum(p => p.REVENUE)) / group.Sum(p => p.VOLUME))

否则,您可以使用“先检查”方法进行单一评估。

var x = Convert.ToDouble(group.Sum(p => p.REVENUE)) / group.Sum(p => p.VOLUME));
Avg = Double.IsInfinity(x)? 0 : x;

答案 2 :(得分:0)

只需替换

Avg = group.Sum(p => p.REVENUE) / group.Sum(p => p.VOLUME),

Avg = group.Sum(p => p.VOLUME) == 0 
    ? 0 
    : group.Sum(p => p.REVENUE) / group.Sum(p => p.VOLUME),