数据表按求和分组
本文关键字:求和 数据表 | 更新日期: 2023-09-27 18:03:12
队列中有以下格式的数据
some table in the Queue
Name Rank
AAA 9
BBB 5
CCC 1
DDD 5
some other table in the Queue
Name Rank
AAA 1
SSS 5
MMM 1
DDD 8
使用LINQ需要一个表一个表地连续处理这些表,并以以下格式将结果添加到全局数据表中:
Name Rank1 Rank2 Rank3 Rank>3
AAA 1 0 0 1
BBB 0 0 0 1
CCC 1 0 0 0
DDD 0 0 0 2
SSS 0 0 0 1
MMM 0 0 0 0
在全局表中,4列表示一个名称在第1、2、3或>3中排名的次数。
如果这个名字已经在全局表中存在,我将不添加它,而只增加列的秩计数,如果不存在,则添加它。
我已经用嵌套循环做到了这一点,但我想知道是否有人可以帮助我用LINQ语法做这样的事情,也会使用LINQ使过程比嵌套循环更快?
请注意,新表每秒钟都添加到队列中,我将从队列中获取一些表,并将其处理为全局数据表
table1.AsEnumerable().Concat(table2.AsEnumerable())
.GroupBy(r => r.Field<string>("Name"))
.Select(g => new {
Name = g.Key,
Rank1 = g.Count(x => x.Field<int>("Rank") == 1),
Rank2 = g.Count(x => x.Field<int>("Rank") == 2),
Rank3 = g.Count(x => x.Field<int>("Rank") == 3),
OtherRank = g.Count(x => x.Field<int>("Rank") > 3)
}).CopyToDataTable();
你需要在泛型T不是DataRow的情况下实现CopyToDataTable方法。
一个小优化的解决方案(单解析和单循环对分组排名):
(from row in table1.AsEnumerable().Concat(table2.AsEnumerable())
group row by row.Field<string>("Name") into g
let ranks = g.Select(x => x.Field<int>("Rank")).ToList()
select new {
Name = g.Key,
Rank1 = ranks.Count(r => r == 1),
Rank2 = ranks.Count(r => r == 2),
Rank3 = ranks.Count(r => r == 3),
OtherRank = ranks.Count(r => r > 3)
}).CopyToDataTable();