在C#中如何按两个列对DataTable进行排序

27

我有一个看起来像下面这样的 DataTable

|              ID                    | ItemIndex |   ItemValue
ce895bd9-9a92-44bd-8d79-986f991154a9     1            3
ae7d714e-a457-41a8-8bb4-b5a0471c3d2f     2            2
a774dff3-acc0-4f50-a211-a775e28dcae3     2            1
292bbd50-290b-4511-9e4e-2e74e3ebe273     3            2
ae7d714e-a457-41a8-8bb3-b5a0471c3d22     3            1

我希望首先按ItemIndex对这个表进行排序,然后再按已排序的表按ItemValue进行排序。

我应该怎么做呢?

编辑:排序后,我想让我的表格如下所示;

|              ID                    | ItemIndex |   ItemValue
ce895bd9-9a92-44bd-8d79-986f991154a9     1            3
a774dff3-acc0-4f50-a211-a775e28dcae3     2            1
ae7d714e-a457-41a8-8bb4-b5a0471c3d2f     2            2
ae7d714e-a457-41a8-8bb3-b5a0471c3d22     3            1
292bbd50-290b-4511-9e4e-2e74e3ebe273     3            2

如何对表格进行分组并单独排序每个项目? - Mehmet Ince
2
DataView dv = new DataView(dt); dv.Sort = "ItemIndex, ItemValue"; - user1838179
7个回答

44
你可以使用 LINQ to DataSet/DataTable
var newDataTable = yourtable.AsEnumerable()
                   .OrderBy(r=> r.Field<int>("ItemIndex"))
                   .ThenBy(r=> r.Field<int>("ItemValue"))  
                   .CopyToDataTable();

1
我们现在有两个 DataTable 对象了吗? - DOK
2
@DOK,是的,但结果可以重新分配给原始DataTable。 - Habib
如何对表格进行分组并单独排序每个项目? - Mehmet Ince

32

简短而简洁,不会创建另一个(可能很大的)对象,而且这段代码非常易读,尽管使用Linq可能更加吸引人。 - DOK
谢谢,它运行得很好。但我不明白dv.Sort之后dt是否是已排序的表。 - Mehmet Ince
@George - 你好,这个方法适用于字符串列,但是我有一列名为ColA的列。它包含字符串值1.23、11.45和2.34,由于这些都是字符串值,你的排序方式对它们没有影响。我现在卡在这里了,应该怎么办? - user6102644
@user612644 我知道这是对一个更早的答案的旧评论。你的问题似乎是古老的“如何对存储为字符串的数字进行排序?”问题。这是一个完全不同范围的完全不同的问题。 - 182764125216

25

在datatable对象上,只需获取defaultview对象并设置排序即可。

dataTable.DefaultView.Sort = "ItemIndex, ItemValue";

这是目前为止最简单的答案,完美地解决了问题,谢谢。 - Taegost
完美地符合我的需求。 - Harsh Bhavsar
3
澄清一下:您仍然需要调用dataTable.DefaultView.ToTable()来执行排序并将(已排序的)行复制到新的DataTable中,或者您可以迭代dataTable.DefaultView。但是您不能仅应用.Sort属性,然后迭代原始dataTable的行,并期望它们以排序顺序排列。 - Mr. T
1
不需要调用ToTable()进行数据绑定。我相信默认视图在内部使用。 - Ty Petrice

12

通过创建数据视图

var dataView = new DataView(dataTable);
dataView.Sort = "ItemIndex ASC, ItemValue ASC"

这里的dataTable是您想要排序的表格


我也会发同样的内容!MSDN参考链接:https://msdn.microsoft.com/zh-cn/library/system.data.dataview.sort(v=vs.110).aspx - vapcguy

3

或者你可以使用这个

DataView oDataSet;
oDataSet.Tables[0].DefaultView.Sort = "Column1 ASC ";

我们如何使用多列来完成这个操作?请检查问题标题。 - precise

3

根据其他人的有用评论,我来发表一下我的看法。

DataView dataView = new DataView(dataTable);//datatable to dataview
dataView.Sort = "columnName1 ASC, columnName2 DESC";//string that contains the column name  followed by "ASC" (ascending) or "DESC" (descending)
dataTable = dataView.ToTable();//push the chages back to the datatable

你值得超过一个大拇指的赞!!!这是唯一一个对我有效的解决方案。 我特意设置了原始查询的不同排序。其他的方法,行并不总是按照期望的顺序排列。这个方法完美无缺!!!(按照12个列排序) 我在比较两个数据集,看行是否相同。目的是查看存储过程的更改是否搞乱了数据。 这个真的值得更多的赞!!!谢谢!!!ToTable()太棒了!!! - undefined

1
_UserAuditTrailTable.DefaultView.Sort = sortExpression;

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