C# 在LINQ查询中包括百分比计算

C# 在LINQ查询中包括百分比计算,c#,linq,C#,Linq,我试图编写一个查询,根据下图计算不同的计数和百分比 到目前为止,我有一部分查询提供了每种颜色的id的不同计数,但是如何在结果中包括每行的百分比?我首先需要合计不同的计数,但无法对结果应用Sum()操作(对所有“IdCount”进行合计) 是 私有IEnumerable\u数据; 一种非常简单的方法是在接收所有数据后计算内存中的总计: var q = ... // your query here .ToList(); // Bring results to memo

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

到目前为止,我有一部分查询提供了每种颜色的id的不同计数,但是如何在结果中包括每行的百分比?我首先需要合计不同的计数,但无法对结果应用Sum()操作(对所有“IdCount”进行合计)

私有IEnumerable\u数据;

一种非常简单的方法是在接收所有数据后计算内存中的总计:

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()
可避免在第二次传递值时再次查询数据。由于颜色数量有限,此查询不会对系统内存造成太大压力。

一种非常简单的方法是在接收到所有数据后计算内存中的总计:

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()
可避免在第二次传递值时再次查询数据。由于颜色数量有限,此查询不会对系统内存造成太大压力。

以下是正在运行的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);
var\u data=新列表{
新数据{
id=1,
color=“a”,
},
新数据{
id=1,
color=“a”,
},
新数据{
id=2,
color=“b”,
}
};
var q=来自_数据中的数据
按data.color将数据分组
让name=groups.Key
让idGroups=从组中的d选择d.id
选择新的
{
颜色=名称,
IdCount=idGroups.Count(),
百分比=数学.Round((十进制)idGroups.Count()/_data.Count,2)
};
控制台写入线(q);

以下是正在运行的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);
var\u data=新列表{
新数据{
id=1,
color=“a”,
},
新数据{
id=1,
color=“a”,
},
新数据{
id=2,
color=“b”,
}
};
var q=来自_数据中的数据
按data.color将数据分组
让name=groups.Key
让idGroups=从组中的d选择d.id
选择新的
{
颜色=名称,
IdCount=idGroups.Count(),
百分比=数学.Round((十进制)idGroups.Count()/_data.Count,2)
};
控制台写入线(q);

您必须将每个组的计数乘以100,然后除以元素数,即计数,因此

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
             };
var q=来自此数据中的数据。\u数据
按data.Field(“颜色”)将数据分组
让name=groups.Key
让idGroups=从组中的d中选择d字段(“id”)
选择新的
{
颜色=名称,
IdCount=idGroups.Count(),
百分比=idGroups.Count()*标量
};

您必须将每个组的计数乘以100,然后除以元素数,即计数,因此

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
             };
var q=来自此数据中的数据。\u数据
按data.Field(“颜色”)将数据分组
让name=groups.Key
让idGroups=从组中的d中选择d字段(“id”)
选择新的
{
颜色=名称,
IdCount=idGroups.Count(),
百分比=idGroups.Count()*标量
};

只需将另一个字段添加到idGroups.Distinct().Count()除以_data.Count()的选择中即可吗?@Defensetrator我不这么认为,总数是每个组的id的不同计数的总和,而不是所有id的总和。只需将另一个字段添加到idGroups.Distinct().Count()所在的选择中即可是除以_data.Count()的吗?@defensetrator我不这么认为,总数是每个组id的不同计数的总和,而不是所有id的总和。我同意@dasblinkenlight对内存进行计算操作。抓取一个设计良好的查询,以便更快地获取数据,然后计算所需的数据。我同意@dasblinkenlight关于在内存上进行计算操作的观点。抓取一个设计良好的查询以更快地获取数据,然后计算您需要的数据。我认为这是错误的,计数应该在不同的计数上,而不是在一个组中的所有id上。在我的图表中,蓝色的计数为6,但我要找的计数是不同项目的数量,因此实际上是3。我认为这是错误的,计数应该在不同的计数上,而不是在一个组中的所有id上。在我的图表中,蓝色的计数得到6,但我要寻找的计数是不同项目的数量,所以实际上是3。这样,我计算每个组的不同id,并以这种方式合计这些计数,我正在计算每个组的不同ID,并将这些计数相加