C# datatable 按照两列排序 当A列值相等时,再按照B列排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# datatable 按照两列排序 当A列值相等时,再按照B列排序相关的知识,希望对你有一定的参考价值。

用datatable的select方法,只能对一列排序,两列怎么实现呢
不用sql文 在代码中实现 谢谢~

datatable 排序这个思路就错了
如果数据量小于1万还行,大于这个值运行会很慢 推荐让sql处理后显示

而且你不可能一次性显示 要分页读取不是吗?

如果你没有用数据库 那肯定用到了arraylist 这些泛型数组
那么就写一个排序算法排序即可
参考技术A DataGridView.Sort(this.dataGridViewTextBoxColumn1, ListSortDirection.Descending);降序
DataGridView.Sort(this.dataGridViewTextBoxColumn1, ListSortDirection.Ascending);升序
在事件里面加入这个,这个排序有限制,具体查看msdn追问

不是用在GridView里面显示 只是对一个datatable排序 得到一个结果集 比如datarow的数组或者一个新的datatable都可以 谢谢~

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

【中文标题】如何在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 按照两列排序 当A列值相等时,再按照B列排序的主要内容,如果未能解决你的问题,请参考以下文章

C# DataTable -> 需要根据列值生成一个ID

C# Winform DataTable 怎么过滤两列不重复

基于两列值的sql排序

从 C# 中的 DataTable 中获取 Distinct Column 以及其他列值

C#如何通过ID从数据表中获取两列值

c#计算datatable中某一列值的和