请求caozhy回答一下,如果是datatable该如何处理

using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
public static void Main()
{
string data = @"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";
string result = string.Join("\r\n", data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(' ')).SelectMany(x => Enumerable.Range(0, x.Count() / 2).Select(y => new { a = x[0], b = x[y * 2 + 1], c = int.Parse(x[y * 2 + 2]) }))
.GroupBy(x => x.a)
.Select(x => new { a = x.Key + " " + x.Count() + "次", b = x.GroupBy(y => y.b).Select(y => new { b = y.Key, c = y.Sum(z => z.c) }) })
.Select(x => x.a + " " + string.Join(" ", x.b.Select(y => y.b + " " + y.c.ToString()))));
Console.WriteLine(result);
}
}

感谢caozhy大师的回答,如果是datatable该如何处理,本人超级菜,多谢了,如果统计aaa bbb的次数,又该如何写了

图片说明

我在飞机场没法详细回答你的问题。大概来说,把最后一个select去掉。

加入如下代码
DataTable dt = new DataTable();
dt.Columns.Add("第一列") ;
dt.Columns.Add("第二列");
foreach (var item in result)
{
dt.Rows.NewRow(new string[] { item.a, item.b.ToArray()[0]}, item.b.ToArray()[1], ... );
}

多谢老师
我的意思是: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"是个datatable 不知道该如何处理,祝老师旅途愉快

caozhy老师 如果数据源是个datatable,是否需要转换为数组,分组排序统计以后生成datatable呢?实在不好意思,希望老师在百忙之中帮我解答一下。谢谢老师,反复的问,惭愧,多谢了

caozhy老师 ,在么?在线等,呵呵

先谢了哈 您帮我看看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"数据源是个datatable 不知道该如何处理

是个横向排列的,挺怪的,估计只有老师这样的大师才能帮我解答了 是否要将datatable 转数组呢,呵呵不好意思哈

新建一个winforms窗体,双击,在form_load编写:

             string data = @"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 result = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries)
                .Select(x => x.Split(' ')).SelectMany(x => Enumerable.Range(0, x.Count() / 2).Select(y => new { a = x[0], b = x[y * 2 + 1], c = int.Parse(x[y * 2 + 2]) }))
                .GroupBy(x => x.a)
                .Select(x => new { a = x.Key + " " + x.Count() + "次", b = x.GroupBy(y => y.b).Select(y => new { b = y.Key, c = y.Sum(z => z.c) }) });
            DataTable dt = new DataTable();
            for (int i = 0; i < 10; i++)
                dt.Columns.Add(((char)(65 + i)).ToString());
            foreach (var item in result)
            {
                var row = dt.NewRow();
                row[0] = item.a;
                int j = 1;
                foreach (var item1 in item.b)
                {
                    row[j++] = item1.b;
                    row[j++] = item1.c;
                }
                dt.Rows.Add(row);
            }
            DataGridView dgv = new DataGridView();
            this.Controls.Add(dgv);
            dgv.Dock = DockStyle.Fill;
            dgv.DataSource = dt;
 你的数据源的datatable表结构是怎么样的。
大概你可以这么写
string data = "";
foreach (var row in datatable.Rows)
{
    data += string.Join(" ", row.ItemArray) + "\r\n";
}
var result = ...

谢了,大师,非常热心的一个人,赞一个,还个问题讨教,如果数据源是个datatable 是转换一下呢还是怎么写?

刚看到,多谢老师指教,祝老师生活愉快

图片说明
和您的表形势差不多,只是多一列而已

caozhy老师 ,在么?您的回答帮我解决的大部分问题,非常感谢,有一个小问题还是没弄明白,请老师指教

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"

这里面只统计aaa 出现3次 bbb出现2次 按您的写法该如何改呢?期待您的回复,多谢