我有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
答案 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");