C# Linq分组依据,同时避免Div/0
我有一个模型,我试图计算加权平均数:C# Linq分组依据,同时避免Div/0,c#,asp.net-mvc,asp.net-mvc-3,linq,C#,Asp.net Mvc,Asp.net Mvc 3,Linq,我有一个模型,我试图计算加权平均数: public class ObScore { public int ObScoreId { get; set; } public int AnalystId { get; set; } public DateTime Date { get; set; } public int PossScore { get; set; } public int Weight { get; set; } } 我可以使用以下
public class ObScore
{
public int ObScoreId { get; set; }
public int AnalystId { get; set; }
public DateTime Date { get; set; }
public int PossScore { get; set; }
public int Weight { get; set; }
}
我可以使用以下代码执行此操作:
//
// GET: /Test/
public ActionResult Test()
{
var scores = db.ObScores.ToList();
double weightedValueSum = scores.Sum(x=>x.PossScore * x.Weight);
double weightSum = scores.Sum(x => x.Weight);
if (weightSum != 0)
{
ViewBag.wa2 = weightedValueSum / weightSum;
}
return View();
}
但是,我希望能够添加一个GroupBy子句,这样我就可以按日期/AnalystId等进行分组
有没有可能合并两个LINQ语句,这样我就可以做到这一点,同时在权重和为0时仍然避免使用DIV/0
谢谢,Mark使用如下表达式:
div = weightSum != 0 ? weightedValueSum / weightSum : -1
最后应该是这样的:
var res = scores.GroupBy(p => p.Date.Year)
.Select(p => new {
Year = p.Key,
weightedValueSum = p.Sum(x => x.PossScore * x.Weight),
weightSum = p.Sum(x => x.Weight)
})
.Select(p => new {
Year = p.Year,
wa2 = p.weightSum != 0 ? p.weightedValueSum / p.weightSum : -1
})
.ToArray();
在完整的LINQ语法中,它应该或多或少地与此等效
var res2 = (from p in scores
group p by p.Date.Year into p
let Year = p.Key
let weightedValueSum = p.Sum(x => x.PossScore * x.Weight)
let weightSum = p.Sum(x => x.Weight)
select new {
Year = Year,
wa2 = weightSum != 0 ? weightedValueSum / weightSum : -1
}).ToArray();
使用如下表达式:
div = weightSum != 0 ? weightedValueSum / weightSum : -1
最后应该是这样的:
var res = scores.GroupBy(p => p.Date.Year)
.Select(p => new {
Year = p.Key,
weightedValueSum = p.Sum(x => x.PossScore * x.Weight),
weightSum = p.Sum(x => x.Weight)
})
.Select(p => new {
Year = p.Year,
wa2 = p.weightSum != 0 ? p.weightedValueSum / p.weightSum : -1
})
.ToArray();
在完整的LINQ语法中,它应该或多或少地与此等效
var res2 = (from p in scores
group p by p.Date.Year into p
let Year = p.Key
let weightedValueSum = p.Sum(x => x.PossScore * x.Weight)
let weightSum = p.Sum(x => x.Weight)
select new {
Year = Year,
wa2 = weightSum != 0 ? weightedValueSum / weightSum : -1
}).ToArray();