2013-03-11 64 views
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需要由表汽車無處理這些表表和結果在下面的格式添加到全局數據表的數據表:

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使這個過程比嵌套循環更快?

注意,新表添加到隊列中每一秒,我會從隊列中獲得sometable並進行處理全球數據表

回答

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(); 

您需要執行CopyToDataTable方法,其中Generic Type T Is Not a DataRow的。


有點優化的解決方案(單解析和單迴路在分組排名):

(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(); 
+0

但將這種增量如果名稱已經存在的行列? – user1590636 2013-03-11 07:56:31

+0

@ user1590636否,如果名稱存在於兩個表中,則每個組'g'將有兩行。然後'排名'將有兩個值。例如。對於AAA組,將會有值'1'和'9'。計算計數會產生'秩1 = 1,秩2 = 0,Rank3 = 0,OtherRank = 1' – 2013-03-11 07:58:21

+1

聲音很大,讓我來試試! – user1590636 2013-03-11 08:01:53