Ordenar filas en una tabla de datos

146

Tenemos dos columnas en a DataTable, así:

COL1   COL2
Abc    5
Def    8
Ghi    3

Estamos tratando de resolver esto datatablebasado en COL2en orden decreciente.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Intentamos esto:

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

pero, sin usar a DataView, queremos ordenar el DataTablepropio, no el DataView.

vidya sagar
fuente

Respuestas:

355

Me temo que no puede hacer fácilmente un DataTable in situ como parece que quiere hacer.

Lo que puede hacer es crear una nueva DataTable a partir de un DataView que cree a partir de su DataTable original. Aplique los tipos y / o filtros que desee en DataView y luego cree una nueva DataTable desde DataView utilizando el método DataView.ToTable :

   DataView dv = ft.DefaultView;
   dv.Sort = "occr desc";
   DataTable sortedDT = dv.ToTable();
Jay Riggs
fuente
Quiero el valor ascendente en términos de valor de precio que es decimal. ¿cómo hacerlo?
Ranjith Kumar Nagiri
Este enfoque parece estar bien. ¿Pero no hay una forma directa de hacerlo? ¿Por qué no tienen un DataTable.sort ("por")?
Steam
28
Gracias. Vale la pena señalar que "occr desc" aquí, "occr" es el nombre de la columna, "desc" significa "descendente".
user1032613
22
Esto funcionó para mí dataTable.DefaultView.Sort = "Col1, Col2, Col3". Pequeño código limpio.
Sai
77
Al igual que @Sai, puede modificar el DataTable.DefaultView.Sort directamente. No es necesario "romper" la vista y recrear una tabla.
Jonny
40

Esto te ayudara...

DataTable dt = new DataTable();         
dt.DefaultView.Sort = "Column_name desc";
dt = dt.DefaultView.ToTable();
Ankita_systematix
fuente
Grandes mentes piensan igual. Estaba a punto de publicar la misma solución después de leer @ JayR's.
Drew Chapin
para Column_name porque estaba confundido sobre lo que estaba oculto en la solución de Jay Riggs :)
Thameem
Solución maravillosa y fácil :)
M. Fawad Surosh
25

Su uso simple. Seleccione la función.

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

Y está hecho ... Feliz codificación

Abdul
fuente
Tenga en cuenta que si, como OP, sólo está interesado en el aspecto de esta clasificación y no quieren filtrar los resultados, se puede especificar esta manera: Select("", "CompanyName ASC").
Tawab Wakil
20

Quizás lo siguiente pueda ayudar:

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

Aquí, también puede usar otras consultas de expresión Lambda.

Vishnu
fuente
14

¿Intentaste usar el Select(filterExpression, sortOrder)método en DataTable? Ver aquí para un ejemplo. Tenga en cuenta que este método no ordenará la tabla de datos en su lugar, si eso es lo que está buscando, pero devolverá una matriz ordenada de filas sin usar una vista de datos.

Brian Rogers
fuente
13

O, si puede usar un DataGridView, simplemente puede llamar 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);
        }
    }
}

Lo que te daría el resultado deseado:

Vista del depurador

Gustavo Mori
fuente
@vidyasagar No hay problema. Además, para referencia futura, si una respuesta es valiosa, debe votarla (por ejemplo, ¿la mía?). Y si una respuesta es "LA" respuesta, debe marcarla como la respuesta (por ejemplo, la de Jay).
Gustavo Mori
11
 table.DefaultView.Sort = "[occr] DESC";
ivg
fuente
Vidya quiere ordenar su mesa por occr en orden desc. Lo que hace el código simple anterior. Hace exactamente lo que Jay Riggs (respuesta aceptada) mostró, excepto que esto se hace en una línea de código.
ivg
2
La sugerencia era mejorar la publicación; en el futuro coloque esa información sobre el código en la respuesta. Para ello, aumenta la posibilidad de que alguien vote la publicación o incluso la seleccione como respuesta.
ΩmegaMan
5

Hay 2 formas de ordenar datos

1) ordenar solo los datos y rellenarlos en la cuadrícula:

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) ordenar la vista predeterminada que es como ordenar con encabezado de columna de cuadrícula:

DataGridView datagridview1 = new DataGridView(); // for show data
DataTable dt1 = new DataTable(); // have data
dt1.DefaultView.Sort = "ID DESC";
datagridview1.DataSource = dt1;
Zolfaghari
fuente
1
Gracias por la respuesta. Su manera # 1 ayudó en mi caso: definí un IComparer muy especial, así que para usarlo hice algo como esto:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei
4

Resulta que hay un caso especial donde esto se puede lograr. El truco consiste en crear la tabla de datos, recopilar todas las filas de una lista, ordenarlas y luego agregarlas. Este caso acaba de llegar aquí.

Joshua
fuente
3

//Espero que esto te ayudará..

        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;
Kumod Singh
fuente
1

TL; DR

utilizar tableObject.Select(queryExpression, sortOrderExpression)para seleccionar datos de manera ordenada

Ejemplo completo

Ejemplo de trabajo completo : se puede probar en una aplicación de consola :

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

Salida

salida

Zameer
fuente
0

prueba esto:

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;
Rand Shaban
fuente
1) Debe crear una nueva tabla DataTable sortedDT = new DataTable(). 2) ImportRow
Debe