5

我有一个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

我想在 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
4

2 回答 2

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 对这些组进行排序,然后按 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();
于 2013-05-29T07:51:54.850 回答
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");
于 2013-05-29T07:51:24.707 回答