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

Posted

技术标签:

【中文标题】如何在c#中按两列对DataTable进行排序【英文标题】:How to sort DataTable by two columns in c# 【发布时间】:2013-04-24 13:13:23 【问题描述】:

我有一个如下所示的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

【问题讨论】:

如何对表格进行分组并分别对每个项目进行排序? DataView dv = new DataView(dt); dv.Sort = "ItemIndex, ItemValue";` 【参考方案1】:

鉴于其他人的帮助,这是我的看法。

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

【讨论】:

【参考方案2】:

或者你可以使用它

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

【讨论】:

我们将如何处理多个列?请检查问题标题。【参考方案3】:
_UserAuditTrailTable.DefaultView.Sort = sortExpression;

【讨论】:

【参考方案4】:

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

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

【讨论】:

这是迄今为止最简单的答案,而且效果很好,谢谢。 完全是我所需要的。 为了澄清:您仍然需要调用 dataTable.DefaultView.ToTable() 以实际执行排序并将(排序的)行复制到新的 DataTable,或者您可以迭代 dataTable。默认视图。但你不能简单地应用 .Sort 属性,然后迭代原始数据表的行并期望它们按排序顺序。 ToTable() 不需要调用数据绑定。我相信默认视图是在内部使用的。【参考方案5】:

通过创建数据视图

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

这里的dataTable是你要排序的表

【讨论】:

会发布同样的东西! MSDN上的参考:msdn.microsoft.com/en-us/library/…【参考方案6】:

创建一个DataView 并使用排序属性:

DataView dv = new DataView(dt);
dv.Sort = "ItemIndex, ItemValue";

例如

foreach (DataRowView row in dv) 
   Console.WriteLine(" 0 \t 1", row["ItemIndex"], row["ItemValue"]);

如需更多信息,请查看 MDSN 以获得更详尽的示例:

http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx

【讨论】:

短小精悍,不会创建另一个(可能很大的)对象,而且这段代码的可读性很高,虽然比使用 Linq 稍微不那么性感。 谢谢,它也很好用。但我不明白 dt 是否是 dv.Sort 之后的排序表。 @George - 嗨,这适用于字符串列,但我有一个列说 ColA。使用字符串值 1.23、11.45 和 2.34,因为这些是字符串值,您的排序方式不会对它们产生影响。我被困在这里我该怎么办? @user612644 我意识到这是对更旧答案的旧评论。您的问题似乎是古老的“如何对存储为字符串的数字进行排序?”问题。那是完全不同范围的完全不同的问题。【参考方案7】:

你可以使用LINQ to DataSet/DataTable

var newDataTable = yourtable.AsEnumerable()
                   .OrderBy(r=> r.Field<int>("ItemIndex"))
                   .ThenBy(r=> r.Field<int>("ItemValue"))  
                   .CopyToDataTable();

【讨论】:

我们现在有两个 DataTable 对象吗? @DOK,是的,但是可以将结果分配回原始数据表。 如何对表格进行分组并分别对每个项目进行排序?

以上是关于如何在c#中按两列对DataTable进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按两列对 MySQL 表排序

如何在R中一次按两列对行进行排名?

如何在R中按两列分组

在C#中按列对二维数组进行排序

如何在熊猫中按两列计算唯一记录?

如何在android中按数值列对listview项目进行排序