我试图根据下图编写一个计算不同计数和百分比的查询
到目前为止,我的部分查询提供了每种颜色的唯一ID数,但是如何在结果中包含百分比和每行?我首先需要总计不同的计数,但我无法将Sum()操作应用于结果(总结所有' IdCount')
var q = from data in this._data
group data by data.Field<string>("color") into groups
let name = groups.Key
let idGroups= from d in groups select d.Field<string>("id")
select new
{
Color = name,
IdCount = idGroups.Distinct().Count()
};
其中
this._data
是
private IEnumerable<DataRow> _data;
答案 0 :(得分:3)
这是linqpad版本的工作原理:
var _data = new List<Data>{
new Data {
id =1,
color="a",
},
new Data {
id =1,
color="a",
},
new Data {
id =2,
color="b",
}
};
var q = from data in _data
group data by data.color into groups
let name = groups.Key
let idGroups = from d in groups select d.id
select new
{
Color = name,
IdCount = idGroups.Count(),
Percent = Math.Round((decimal)idGroups.Count() / _data.Count, 2)
};
Console.WriteLine(q);
答案 1 :(得分:1)
一种非常简单的方法是在收到所有数据后计算内存总量:
var q = ... // your query here
.ToList(); // Bring results to memory
decimal total = q.Sum(r => r.IdCount);
var res = q.Select(r => new {
r.Color
, r.IdCount
, Percentage = 100 * r.IdCount / total;
});
使用ToList()
可以避免在第二次通过值时再次查询数据。由于颜色数量有限,因此该查询不会对系统内存造成太大压力。
答案 2 :(得分:0)
您必须将每个组计数乘以100并除以元素数,即Count,所以
double scalar = 100.0 / this._data;
然后在LINQ查询中使用此标量:
var q = from data in this._data
group data by data.Field<string>("color") into groups
let name = groups.Key
let idGroups= from d in groups select d.Field<string>("id")
select new
{
Color = name,
IdCount = idGroups.Count(),
Percentage = idGroups.Count() * scalar
};