数据表按求和分组

本文关键字:求和 数据表 | 更新日期: 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();