輸入資料(空白分隔,首欄為群組鍵):
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
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 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;
| A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|
| aaa 3次 | bb | 21 | cc | 36 | dd | 24 | ee | 39 | |
| bbb 2次 | a1 | 12 | a2 | 16 | a3 | 12 |
SelectMany 扁平化雙層結構。GroupBy 串聯實現多層分組。DataTable 欄位適應不固定的次級分組數量。