C# DataTable按某列分组

将DataTable按某列分组,效果如下图

测试数据
private DataTable InitData()
{
    DataTable dataTable = new DataTable();
    dataTable.Columns.Add(new DataColumn("id"));
    dataTable.Columns.Add(new DataColumn("QQ"));
    dataTable.Columns.Add(new DataColumn("name"));
    dataTable.Columns.Add(new DataColumn("area"));
    dataTable.Columns.Add(new DataColumn("Remarks"));

    DataRow dr1 = dataTable.NewRow();
    dr1["id"] = 1;
    dr1["QQ"] = "78630559";
    dr1["name"] = "罗分明";
    dr1["area"] = "广东";
    dr1["Remarks"] = "www.luofenming.com";
    dataTable.Rows.Add(dr1);

    DataRow dr2 = dataTable.NewRow();
    dr2["id"] = 2;
    dr2["QQ"] = "2334160";
    dr2["name"] = "lqwvje";
    dr2["area"] = "江西";
    dr2["Remarks"] = "www.995w.com";
    dataTable.Rows.Add(dr2);

    DataRow dr3 = dataTable.NewRow();
    dr3["id"] = 3;
    dr3["QQ"] = "888888";
    dr3["name"] = "8888";
    dr3["area"] = "广东";
    dr3["Remarks"] = "8888";
    dataTable.Rows.Add(dr3);

    DataRow dr4 = dataTable.NewRow();
    dr4["id"] = 4;
    dr4["QQ"] = "12345";
    dr4["name"] = "123";
    dr4["area"] = "广东";
    dr4["Remarks"] = "123";
    dataTable.Rows.Add(dr4);

    DataRow dr5 = dataTable.NewRow();
    dr5["id"] = 5;
    dr5["QQ"] = "9999";
    dr5["name"] = "999";
    dr5["area"] = "江西";
    dr5["Remarks"] = "999";
    dataTable.Rows.Add(dr5);

    DataRow dr6 = dataTable.NewRow();
    dr6["id"] = 6;
    dr6["QQ"] = "5555";
    dr6["name"] = "555";
    dr6["area"] = "浙江";
    dr6["Remarks"] = "55";
    dataTable.Rows.Add(dr6);

    return dataTable;
}

核心代码如下
DataTable dt = InitData();
IEnumerable<IGrouping<string, DataRow>> result = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>(dr => dr["area"].ToString());
if (result != null && result.Count() > 0)
{
    foreach (IGrouping<string, DataRow> rows in result)
    {
        DataTable dataTable = rows.ToArray().CopyToDataTable();
    }
}