对数据表中的行进行排序


146

我们在中有两列DataTable,如下所示:

COL1   COL2
Abc    5
Def    8
Ghi    3

我们正在努力解决这datatable基础上COL2按递减顺序。

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

我们尝试了这个:

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

但是,不使用a DataView,我们要对DataTable自身进行排序,而不要对进行排序DataView

Answers:


355

恐怕您不能像听起来那样轻松地就地执行DataTable的排序。

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

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

我希望值以十进制的价格值递增。怎么做?
Ranjith Kumar Nagiri 2013年

这种方法似乎很好。但是,没有直接的方法吗?他们为什么没有DataTable.sort(“ by”)?
Steam

28
谢谢。值得注意的是,这里的“ occr desc”,“ occr”是列名,“ desc”的意思是“降序”。
user1032613 2014年

22
这为我工作dataTable.DefaultView.Sort =“ Col1,Col2,Col3”。一点干净的代码。
2015年

7
就像@Sai一样,您可以直接修改DataTable.DefaultView.Sort。无需“分解”视图并重新创建表。
强尼

40

这将帮助您...

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

英雄所见略同。阅读@ JayR's之后,我将发布相同的解决方案。
德鲁·查平

对于Column_name,因为我很困惑Jay Riggs解决方案中的occr是什么:)
Thameem

奇妙而简单的解决方案:)
M. Fawad Surosh

25

它的简单使用.Select函数。

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

完成了...快乐编码


需要注意的是,如果像OP,你只是在这个排序方面感兴趣,不想过滤结果,你可以像这样指定它:Select("", "CompanyName ASC")
Tawab Wakil

20

也许以下可以帮助您:

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

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


14

您是否尝试Select(filterExpression, sortOrder)在DataTable上使用该方法?请参阅此处的示例。请注意,如果您要查找的话,此方法将不会对数据表进行适当排序,但是它将返回一个已排序的行数组,而不使用数据视图。


13

或者,如果您可以使用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)。
古斯塔沃·莫里

11
 table.DefaultView.Sort = "[occr] DESC";

Vidya希望按occr对其表进行排序。上面的简单代码可以做到。它确实做到了杰伊·里格斯(Jay Riggs)(可接受的答案)所示的内容,只不过这是用一行代码完成的。
2015年

2
建议是改善职位。在将来将有关代码的信息放入响应中。因为这样可以更好地提高某人赞成该帖子甚至选择它作为答案的机会。
ΩmegaMan

5

有2种排序数据的方式

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
感谢你的回答。在我的情况下,您的方法1有所帮助:我定义了一个非常特殊的IComparer,因此要使用它,我做了如下操作:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei

4

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


3

//希望这个能对您有所帮助..

        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;

1

TL; DR

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

完整的例子

完整的工作示例 -可以在控制台应用程序中进行测试:

    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();
            }
        }
    }

输出量

输出


0

试试这个:

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(您不能从其他表中添加行)
marbel82
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.