【问题标题】:Sort DataTable based on two columns根据两列对 DataTable 进行排序
【发布时间】:2017-11-25 03:02:46
【问题描述】:

我目前有一个填充了数据的 DataTable,但是,我想在使用它之前根据两列对其进行排序。

这是我的 DataTable 的样子

数据表dt:

   Date    | Serial Number
22/06/2017 |       2
20/06/2017 |       1
22/06/2017 |       1
20/06/2017 |       2

我在网上进行了研究,并尝试了dt.DefaultView.SortLINQ,但我无法让它发挥作用。我已经尝试了以下这些:

dt.DefaultView.Sort = "Date, Serial Number";

DataTable newDt = dt.AsEnumerable().OrderBy(r => r.Field<DateTime>("Date"))
.ThenBy(r => r.Field<int>("Serial Number")).CopyToDataTable();

我尝试了上面提到的两种方法,我得到的结果是排序仅基于一列,例如:

   Date    | Serial Number
22/06/2017 |       2
22/06/2017 |       1
20/06/2017 |       1
20/06/2017 |       2

但这不是我想要的。下面是我想要的,

预期结果:

   Date    | Serial Number
20/06/2017 |       1
20/06/2017 |       2
22/06/2017 |       1
22/06/2017 |       2

我可以知道是否有任何方法可以执行以这种方式对 DataTable 进行排序的操作?谢谢。

【问题讨论】:

  • 是什么阻止你分享你尝试过的代码?
  • @ChetanRanpariya 没有什么能阻止我分享。我只是想直奔主题。如果你能问,我可以分享。
  • 如果我们不知道您尝试了什么以及哪里出了问题,那么很难理解可能是什么问题并提供解决方案。如果您可以分享您的代码,将会很有帮助。
  • @ChetanRanpariya 应要求,我已经用示例和结果更新了帖子。

标签: c# asp.net sorting datatable


【解决方案1】:

在 LINQ 中你会使用

XXX.OrdyBy(o => o.Field1).ThenBy(o => o.Field2)

【讨论】:

  • 我已经更新了帖子,请看看。还是谢谢!
【解决方案2】:

以下代码似乎对我有用。

using System.Data;

namespace ConsoleApplication1
{
class Program
{
    static DataTable Dt;
    static void Main(string[] args)
    {
        Dt = new DataTable();
        Dt.Columns.Add(new DataColumn("date", typeof(DateTime)));
        Dt.Columns.Add(new DataColumn("Serial Number", typeof(int)));

        AddRow(Dt.NewRow(), new DateTime(2017, 06, 22), 2);

        AddRow(Dt.NewRow(), new DateTime(2017, 06, 22), 1);
        AddRow(Dt.NewRow(), new DateTime(2017, 06, 20), 2);
        AddRow(Dt.NewRow(), new DateTime(2017, 06, 20), 1);
        foreach(DataRow dr in Dt.Rows)
        {
            Console.WriteLine(string.Format("{0}\t{1}", dr[0], dr[1]));
        }
        DataView dv = Dt.DefaultView;
        dv.Sort = "date, Serial Number";
        foreach(DataRow dr in dv.ToTable().Rows)
        {
            Console.WriteLine(string.Format("{0}\t{1}", dr[0], dr[1]));
        }
        Console.ReadKey();
    }

    static void AddRow(DataRow dr, DateTime dt, int serialNumber)
    {
        dr[0] = dt;
        dr[1] = serialNumber;
        Dt.Rows.Add(dr);
    }
}
}

【讨论】:

    最近更新 更多