【问题标题】:Sorting rows in a data table对数据表中的行进行排序
【发布时间】:2012-02-24 20:19:39
【问题描述】:

DataTable 中有两列,如下所示:

COL1   COL2
Abc    5
Def    8
Ghi    3

我们正在尝试根据COL2 以降序对这个datatable 进行排序。

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

我们试过这个:

ft.DefaultView.Sort = "COL2 desc";
ft = ft.DefaultView.ToTable(true);

但是,如果不使用DataView,我们希望对DataTable 本身进行排序,而不是对DataView

【问题讨论】:

    标签: c# sorting datatable


    【解决方案1】:

    恐怕你不能像你想做的那样轻松地做一个就地排序的 DataTable。

    您可以做的是从您从原始 DataTable 创建的 DataView 创建一个新的 DataTable。在 DataView 上应用您想要的任何排序和/或过滤器,然后使用 DataView.ToTable 方法从 DataView 创建一个新的 DataTable:

       DataView dv = ft.DefaultView;
       dv.Sort = "occr desc";
       DataTable sortedDT = dv.ToTable();
    

    【讨论】:

    • 我希望值以十进制的价格值递增。怎么办?
    • 这种方法看起来不错。但是没有直接的方法吗?为什么他们没有 DataTable.sort("by") ?
    • 谢谢。值得注意的是,这里的“occr desc”,“occr”是列名,“desc”表示“降序”。
    • 这对我有用 dataTable.DefaultView.Sort = "Col1, Col2, Col3"。干净的小代码。
    • 就像@Sai一样,可以直接修改DataTable.DefaultView.Sort。无需“拆分”视图并重新创建表格。
    【解决方案2】:

    这会帮助你...

    DataTable dt = new DataTable();         
    dt.DefaultView.Sort = "Column_name desc";
    dt = dt.DefaultView.ToTable();
    

    【讨论】:

    • 伟大的思想都一样。阅读@JayR 后,我正要发布相同的解决方案。
    • for Column_name 因为我对 Jay Riggs 的解决方案中的 occr 感到困惑 :)
    • 奇妙而简单的解决方案:)
    【解决方案3】:

    它的简单使用.Select函数。

    DataRow[] foundRows=table.Select("Date = '1/31/1979' or OrderID = 2", "CompanyName ASC");
    DataTable dt = foundRows.CopyToDataTable();
    

    它完成了......快乐编码

    【讨论】:

    • 请注意,如果像 OP 一样,您只对排序方面感兴趣并且不想过滤结果,则可以这样指定:Select("", "CompanyName ASC")
    • 这是一个绝妙的答案。允许使用动态生成的文本字符串进行过滤和排序!很高兴我找到了这个答案!
    【解决方案4】:

    也许以下内容会有所帮助:

    DataRow[] dataRows = table.Select().OrderBy(u => u["EmailId"]).ToArray();
    

    在这里,您也可以使用其他 Lambda 表达式查询。

    【讨论】:

      【解决方案5】:

      或者,如果您可以使用DataGridView,您可以直接拨打Sort(column, direction)

      namespace Sorter
      {
          using System;
          using System.ComponentModel;
          using System.Windows.Forms;
      
          public partial class Form1 : Form
          {
              public Form1()
              {
                  InitializeComponent();
              }
      
              private void Form1_Load(object sender, EventArgs e)
              {
                  this.dataGridView1.Rows.Add("Abc", 5);
                  this.dataGridView1.Rows.Add("Def", 8);
                  this.dataGridView1.Rows.Add("Ghi", 3);
                  this.dataGridView1.Sort(this.dataGridView1.Columns[1], 
                                          ListSortDirection.Ascending);
              }
          }
      }
      

      这会给你想要的结果:

      【讨论】:

      • @vidyasagar 没问题。此外,为了将来参考,如果答案很有价值,您应该投票(例如,我的?)。如果答案是“THE”答案,则应将其标记为答案(例如 Jay's)。
      【解决方案6】:

      您是否尝试在 DataTable 上使用 Select(filterExpression, sortOrder) 方法?有关示例,请参阅here。请注意,此方法不会对数据表进行适当的排序,如果这是您要查找的内容,但它会在不使用数据视图的情况下返回已排序的行数组。

      【讨论】:

        【解决方案7】:
         table.DefaultView.Sort = "[occr] DESC";
        

        【讨论】:

        • Vidya 想按 occr 以 desc 的顺序对他的表进行排序。上面的简单代码就是这样做的。它完全符合 Jay Riggs(已接受的答案)所展示的内容,但这是在一行代码中完成的。
        • 建议是为了更好地发布帖子;将来将有关代码的信息放入响应中。因为它增加了有人支持该帖子甚至选择它作为答案的机会。
        【解决方案8】:

        使用 LINQ - C# 之美

        DataTable newDataTable = baseTable.AsEnumerable()
                           .OrderBy(r=> r.Field<int>("ColumnName"))
                           .CopyToDataTable();
        

        【讨论】:

        • 添加上下文,以便我们学习并防止否决或删除问题。 EOR。
        【解决方案9】:

        数据排序有两种方式

        1) 仅对数据进行排序并填充到网格中:

        DataGridView datagridview1 = new DataGridView(); // for show data
        DataTable dt1 = new DataTable(); // have data
        DataTable dt2 = new DataTable(); // temp data table
        DataRow[] dra = dt1.Select("", "ID DESC");
        if (dra.Length > 0)
            dt2 = dra.CopyToDataTable();
        datagridview1.DataSource = dt2;
        

        2) 排序默认视图,类似于带有网格列标题的排序:

        DataGridView datagridview1 = new DataGridView(); // for show data
        DataTable dt1 = new DataTable(); // have data
        dt1.DefaultView.Sort = "ID DESC";
        datagridview1.DataSource = dt1;
        

        【讨论】:

        • 感谢您的回答。您的方式 #1 对我有帮助:我定义了一个非常特殊的 IComparer,所以为了使用它,我做了这样的事情:DataRow[] rows = dt.Rows.Cast&lt;DataRow&gt;().OrderBy(row =&gt; row.Field&lt;string&gt;("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
        【解决方案10】:

        事实证明,这是可以实现的一种特殊情况。诀窍是在构建 DataTable 时,收集列表中的所有行,对它们进行排序,然后添加它们。这个案子刚刚出现在这里。

        【讨论】:

          【解决方案11】:

          //希望对你有帮助..

                  DataTable table = new DataTable();
                  //DataRow[] rowArray = dataTable.Select();
                  table = dataTable.Clone();
                  for (int i = dataTable.Rows.Count - 1; i >= 0; i--)
                  {
                      table.ImportRow(dataTable.Rows[i]);
                  }
                  return table;
          

          【讨论】:

            【解决方案12】:

            TL;DR

            使用tableObject.Select(queryExpression, sortOrderExpression)以排序方式选择数据

            完整示例

            完整的working example - 可以在console application 中测试:

                using System;
                using System.Data;
            
                namespace A
                {
                    class Program
                    {
                        static void Main(string[] args)
                        {
                            DataTable table = new DataTable("Orders");
                            table.Columns.Add("OrderID", typeof(Int32));
                            table.Columns.Add("OrderQuantity", typeof(Int32));
                            table.Columns.Add("CompanyName", typeof(string));
                            table.Columns.Add("Date", typeof(DateTime));
            
                            DataRow newRow = table.NewRow();
                            newRow["OrderID"] = 1;
                            newRow["OrderQuantity"] = 3;
                            newRow["CompanyName"] = "NewCompanyName";
                            newRow["Date"] = "1979, 1, 31";
            
                            // Add the row to the rows collection.
                            table.Rows.Add(newRow);
            
                            DataRow newRow2 = table.NewRow();
                            newRow2["OrderID"] = 2;
                            newRow2["OrderQuantity"] = 2;
                            newRow2["CompanyName"] = "NewCompanyName1";
                            table.Rows.Add(newRow2);
            
                            DataRow newRow3 = table.NewRow();
                            newRow3["OrderID"] = 3;
                            newRow3["OrderQuantity"] = 2;
                            newRow3["CompanyName"] = "NewCompanyName2";
                            table.Rows.Add(newRow3);
            
                            DataRow[] foundRows;
            
                            Console.WriteLine("Original table's CompanyNames");
                            Console.WriteLine("************************************");
                            foundRows = table.Select();
            
                            // Print column 0 of each returned row.
                            for (int i = 0; i < foundRows.Length; i++)
                                Console.WriteLine(foundRows[i][2]);
            
                            // Presuming the DataTable has a column named Date.
                            string expression = "Date = '1/31/1979' or OrderID = 2";
                            // string expression = "OrderQuantity = 2 and OrderID = 2";
            
                            // Sort descending by column named CompanyName.
                            string sortOrder = "CompanyName ASC";
            
                            Console.WriteLine("\nCompanyNames data for Date = '1/31/1979' or OrderID = 2, sorted CompanyName ASC");
                            Console.WriteLine("************************************");
                            // Use the Select method to find all rows matching the filter.
                            foundRows = table.Select(expression, sortOrder);
            
                            // Print column 0 of each returned row.
                            for (int i = 0; i < foundRows.Length; i++)
                                Console.WriteLine(foundRows[i][2]);
            
                            Console.ReadKey();
                        }
                    }
                }
            

            输出

            【讨论】:

              【解决方案13】:

              试试这个:

              DataTable DT = new DataTable();
              DataTable sortedDT = DT;
              sortedDT.Clear();
              foreach (DataRow row in DT.Select("", "DiffTotal desc"))
              {
                  sortedDT.NewRow();
                  sortedDT.Rows.Add(row);
              }
              DT = sortedDT;
              

              【讨论】:

              • 1) 您必须创建新表DataTable sortedDT = new DataTable()。 2)你需要使用ImportRow(你不能从不同的表中添加行)
              【解决方案14】:

              是的,上面的答案描述了对数据表进行排序的正确方法

              DataView dv = ft.DefaultView;
              dv.Sort = "occr desc";
              DataTable sortedDT = dv.ToTable();
              

              但除此之外,要选择其中的特定行,您可以使用 LINQ 并尝试关注

              var Temp = MyDataSet.Tables[0].AsEnumerable().Take(1).CopyToDataTable();
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-07
                • 1970-01-01
                • 2017-05-18
                • 2016-10-29
                • 1970-01-01
                相关资源
                最近更新 更多