3

在队列中,我有以下格式的数据表

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 需要逐表处理这些表,并将结果添加到以下格式的全局 DataTable 中:

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 也会比嵌套循环更快地处理这个过程吗?

请注意,新表每秒都会添加到队列中,我将从队列中获取一些表并将其处理到全局数据表

4

1 回答 1

4
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();
于 2013-03-11T07:46:52.870 回答