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

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