如何在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进行排序的主要内容,如果未能解决你的问题,请参考以下文章