C# 按数据表分组并将每个组的项目写入文本文件

C# group by Datatable and write the items per each group to a text file

我有一个包含两列的数据表,一列是名称,另一列是组

示例-

Name     Group
John     HR,Finance
Tom      HR,
Jonna    Finance,
Adam     IT,
Rachael  Default,IT,

我想将以上数据按组名分组,然后将其写入文本文件,如下所示

Start - HR
John
Tom
End

Start - Finance
John
Jonna
End

Start - IT
Adam 
Rachael  
End

Start - Default
Rachael
End

这就是我分组的方式,但无法思考如何解决以逗号分隔的多个组,然后使用该信息写入上述文本文件

  var result = from row in dt.AsEnumerable()
                group row by row.Field<string>("GroupName") into grp
                select grp.ToList();

如有任何帮助,我们将不胜感激。

// sample data
var table = new DataTable();

table.Columns.Add("Name", typeof(string));
table.Columns.Add("Group", typeof(string));

table.Rows.Add("John", "HR,Finance");
table.Rows.Add("Tom", "HR,");
table.Rows.Add("Jonna", "Finance,");
table.Rows.Add("Adam", "IT,");
table.Rows.Add("Rachael", "Default,IT,");

// get a distinct list of all the departments
var departments = table.AsEnumerable()
                       .SelectMany(r => r.Field<string>("Group").Split(new[] { ',' },
                                        StringSplitOptions.RemoveEmptyEntries))
                       .Distinct();

// loop through each department
foreach (string department in departments)
{

    // get any employees that are apart of the current department
    var employees = table.AsEnumerable()
                         .Where(r => r.Field<string>("Group").Contains(department));

    // write output according to OP's format
    Console.WriteLine("Start - {0}", department);

    foreach (var employee in employees)
        Console.WriteLine(employee.Field<string>("Name"));

    Console.WriteLine("End");
    Console.WriteLine();
}

输出:

Start - HR
John
Tom
End

Start - Finance
John
Jonna
End

Start - IT
Adam
Rachael
End

Start - Default
Rachael
End

给你

var result = dt.AsEnumerable()
    .SelectMany(row => row.Field<string>("Group").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries),
        (row, group) => new { group, row })
    .GroupBy(item => item.group);

示例用法

TextWriter writer = Console.Out; // File.CreateText(@"...");
foreach (var group in result)
{
    writer.WriteLine("Start - " + group.Key);
    foreach (var item in group)
        writer.WriteLine(item.row.Field<string>("Name"));
    writer.WriteLine("End");
    writer.WriteLine();
}