【问题标题】:How to sort DataTable by two columns in c#如何在c#中按两列对DataTable进行排序
【发布时间】: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";`

标签: c# asp.net sorting datatable


【解决方案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是你要排序的表

      【讨论】:

      【解决方案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,是的,但是可以将结果分配回原始数据表。
      • 如何对表格进行分组并分别对每个项目进行排序?
      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2013-09-16
      相关资源
      最近更新 更多