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

Meh*_*nce 4 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
Run Code Online (Sandbox Code Playgroud)

我想在DataTable上面ItemName进行分组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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 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();
Run Code Online (Sandbox Code Playgroud)

我想通过ItemName对DataTable进行分组,然后首先按ItemNo对这些组进行排序,然后按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();
Run Code Online (Sandbox Code Playgroud)