我有以下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。
答案 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),