在LINQ查询中包含百分比计算

时间:2017-09-13 14:24:28

标签: c# linq

我试图根据下图编写一个计算不同计数和百分比的查询

到目前为止,我的部分查询提供了每种颜色的唯一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;

enter image description here

3 个答案:

答案 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
             };