如何对DataTable进行分组并按字段对每个组进行排序?

时间:2013-05-29 07:46:40

标签: c# datatable

我有DataTable,如下所示;

| ItemName | ItemNo |   ItemValue
     A         2            3,1
     B         1            2,2
     C         3            1,5
     A         2            2,0
     B         1            1,4
     A         2            2,7
     C         3            1,3
     C         3            2,1
     B         1            1,9

我希望按ItemName对DataTable进行分组,然后先按ItemNo对这些组进行排序,然后按ItemValue对每个已排序的组进行排序。

我怎样才能做到这一点?

注意:排序后,我想要我的表格如下;

| ItemName | ItemNo |   ItemValue
     B         1            1,4
     B         1            1,9
     B         1            2,2
     A         2            2,0
     A         2            2,7
     A         2            3,1
     C         3            1,3
     C         3            1,5
     C         3            2,1

2 个答案:

答案 0 :(得分:9)

table = table.AsEnumerable()
             .GroupBy(r => r.Field<string>("ItemName"))
             .OrderBy(g => g.Max(r => r.Field<int>("ItemNo")))
             .SelectMany(g => g.OrderBy(r => r.Field<double>("ItemValue")))
             .CopyToDataTable();
  

我希望按ItemName对DataTable进行分组,然后对这些组进行排序   ItemNo first,然后按ItemValue对每个已排序的组进行排序。

但是ItemNo不是goup-key的一部分,那么如果每个组中的值不同(与样本数据相对),您希望如何按ItemNo对组进行排序?按最大/最小/平均值?我使用Max来演示一种方法。

编辑所以实际上两列都属于同一个键,然后我会使用匿名类型作为包含两列的分组键,然后它更清晰:

table = table.AsEnumerable()
             .GroupBy(r => new
             { 
                 ItemName = r.Field<string>("ItemName"),
                 ItemNo   = r.Field<int>("ItemNo") 
             })
             .OrderBy(g => g.Key.ItemNo)
             .SelectMany(g => g.OrderBy(r => r.Field<double>("ItemValue")))
             .CopyToDataTable();

答案 1 :(得分:3)

您可以定义SortYourDataTable方法,例如;

public static DataTable SortYourDataTable(DataTable dt, string column)
{
    dt.DefaultView.Sort = column;
    dt = dt.DefaultView.ToTable();
    return dt;
}

然后打电话给它;

SortYourDataTable(SortYourDataTable(SortYourDataTable(dt, "ItemNo"), "ItemName"), "ItemValue");