在队列中我有以下格式的数据表
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使进程比嵌套循环更快吗?
请注意,新表每秒都会添加到队列中,我将从队列中获取一些表并将其处理为全局数据表
答案 0 :(得分: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();
您需要在Generic Type T Is Not a 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();