首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# LINQ 分組統計:多層級 GroupBy 動態生成 DataTable

     編輯:程式設計疑難解答

需求:統計每組首欄出現次數,並展開次級分組彙總

輸入資料(空白分隔,首欄為群組鍵):

aaa bb 10 cc 11 dd 12 ee 13
aaa cc 9 dd 4 bb 2 ee 13
aaa cc 16 bb 9 dd 8 ee 13
bbb a1 6 a2 9 a3 8
bbb a2 7 a3 4 a1 6

核心 LINQ 邏輯


var lines = data.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)
                .Select(l => l.Split(' '));

var result = lines
    .SelectMany(parts => 
        Enumerable.Range(0, parts.Length / 2)
                  .Select(i => new { 
                      Group = parts[0],           // 首欄群組鍵
                      Key   = parts[i * 2 + 1],   // 次級鍵
                      Value = int.Parse(parts[i * 2 + 2]) 
                  }))
    .GroupBy(x => x.Group)                       // 第一層分組
    .Select(g => new {
        GroupName = g.Key + " " + g.Count() + "次", // 含出現次數
        SubGroups = g.GroupBy(x => x.Key)           // 第二層分組
                      .Select(sg => new {
                          Key = sg.Key,
                          Sum = sg.Sum(x => x.Value)
                      })
    });

動態填充 DataTable 並繫結 DataGridView


DataTable dt = new DataTable();
for (int i = 0; i < 10; i++) dt.Columns.Add(((char)('A' + i)).ToString());

foreach (var grp in result) {
    var row = dt.NewRow();
    row[0] = grp.GroupName;
    int col = 1;
    foreach (var sg in grp.SubGroups) {
        row[col++] = sg.Key;
        row[col++] = sg.Sum;
    }
    dt.Rows.Add(row);
}

dataGridView1.DataSource = dt;

輸出效果

ABCDEFGHIJ
aaa 3次bb21cc36dd24ee39
bbb 2次a112a216a312

關鍵技巧

  • SelectMany 扁平化雙層結構。
  • GroupBy 串聯實現多層分組。
  • 動態 DataTable 欄位適應不固定的次級分組數量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved