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

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

我想通过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个回答

10
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不是分组键的一部分,如果每个组中的值不同(与您的示例数据相反),那么您要如何按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();

每个组都有唯一的编号。因此,A组的ItemNo = 2,B组的ItemNo = 1,C组的ItemNo = 3。在分组后,表格必须按这些ItemNo进行排序。 - Mehmet Ince
@MehmetInce:实际上这两列都属于同一个键,那么我会使用一个带有这两个列的匿名类型作为分组键,这样甚至更清楚:.GroupBy(r => new{ ItemName=r.Field<string>("ItemName"), ItemNo=r.Field<int>("ItemNo") }).OrderBy(g => g.Key.ItemNo)。编辑了我的回答。 - Tim Schmelter
在Visual Studio中出现了语法错误。你能否在上面的回答中写下最新的解决方案?非常感谢你们的回复 :) - Mehmet Ince
@MehmetInce:我已经编辑了我的答案,包括这种方法。 - Tim Schmelter

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接