Zeilen in einer Datentabelle sortieren


146

Wir haben zwei Spalten in a DataTable, so:

COL1   COL2
Abc    5
Def    8
Ghi    3

Wir versuchen , diese zu sortieren , datatablebasierend auf COL2in absteigender Reihenfolge.

COL1            COL2
ghi             8
abc             4
def             3
jkl             1

Wir haben das versucht:

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

aber ohne a DataViewwollen wir das DataTableselbst sortieren , nicht das DataView.

Antworten:


355

Ich fürchte, Sie können eine In-Place-Art von DataTable nicht einfach so erstellen, wie es sich anhört.

Sie können eine neue Datentabelle aus einer DataView erstellen, die Sie aus Ihrer ursprünglichen Datentabelle erstellen. Wenden Sie die gewünschten Sortierungen und / oder Filter auf die DataView an und erstellen Sie dann mit der DataView.ToTable- Methode eine neue DataTable aus der DataView :

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

Ich möchte, dass der Wert in Bezug auf den Preiswert aufsteigt, der dezimal ist. wie es geht?
Ranjith Kumar Nagiri

Dieser Ansatz scheint in Ordnung zu sein. Aber gibt es keinen direkten Weg, dies zu tun? Warum haben sie keine DataTable.sort ("by")?
Steam

28
Vielen Dank. Es ist erwähnenswert, dass "occr desc" hier "occr" der Spaltenname ist, "desc" bedeutet "absteigend".
user1032613

22
Dies funktionierte für mich dataTable.DefaultView.Sort = "Col1, Col2, Col3". Wenig sauberer Code.
Sai

7
Genau wie bei @Sai können Sie DataTable.DefaultView.Sort direkt ändern. Sie müssen die Ansicht nicht "ausbrechen" und eine Tabelle neu erstellen.
Jonny

40

Das wird dir helfen...

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

Große Köpfe denken ähnlich. Ich wollte die gleiche Lösung veröffentlichen, nachdem ich @ JayR's gelesen hatte.
Drew Chapin

für Column_name, weil ich verwirrt war, was in Jay Riggs 'Lösung
vorkam

Wunderbare und einfache Lösung :)
M. Fawad Surosh

25

Seine einfache Verwendung. Auswahlfunktion.

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

Und es ist geschafft ...... Happy Coding


Beachten Sie, dass Sie, wenn Sie wie OP nur am Sortieraspekt interessiert sind und die Ergebnisse nicht filtern möchten, Folgendes angeben können : Select("", "CompanyName ASC").
Tawab Wakil

20

Vielleicht kann folgendes helfen:

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

Hier können Sie auch andere Lambda-Ausdrucksabfragen verwenden.


14

Haben Sie versucht, die Select(filterExpression, sortOrder)Methode in DataTable zu verwenden? Siehe hier für ein Beispiel. Beachten Sie, dass diese Methode die Datentabelle nicht an Ort und Stelle sortiert, wenn Sie danach suchen, sondern ein sortiertes Array von Zeilen ohne Verwendung einer Datenansicht zurückgibt.


13

Oder wenn Sie a verwenden können DataGridView, können Sie einfach anrufen 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);
        }
    }
}

Welches würde Ihnen das gewünschte Ergebnis geben:

Debugger-Ansicht


@vidyasagar Kein Problem. Wenn eine Antwort zum späteren Nachschlagen wertvoll ist, sollten Sie sie auch abstimmen (Beispiel: meine?). Und wenn eine Antwort "DIE" Antwort ist, sollten Sie sie als Antwort markieren (Beispiel: Jay's).
Gustavo Mori

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

Vidya möchte seinen Tisch in absteigender Reihenfolge nach Occr sortieren. Was der einfache Code oben tut. Es macht genau das, was Jay Riggs (akzeptierte Antwort) gezeigt hat, außer dass dies in einer Codezeile erfolgt.
ivg

2
Der Vorschlag war, die Post zu verbessern; Platzieren Sie diese Informationen über den Code in Zukunft in der Antwort. Denn es ist besser, wenn jemand den Beitrag positiv bewertet oder ihn sogar als Antwort auswählt.
ΩmegaMan

5

Es gibt zwei Möglichkeiten zum Sortieren von Daten

1) nur Daten sortieren und in Raster füllen:

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) Sortieren Sie die Standardansicht, die der Sortierung mit der Rasterspaltenüberschrift ähnelt:

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

1
Danke für die Antwort. Ihr Weg Nr. 1 hat in meinem Fall geholfen: Ich habe einen ganz besonderen IComparer definiert, also habe ich so etwas gemacht:DataRow[] rows = dt.Rows.Cast<DataRow>().OrderBy(row => row.Field<string>("FIELD_NAME"), MyCustomComparer.Instance).ToArray();
Aleksei

4

Es stellt sich heraus, dass es einen Sonderfall gibt, in dem dies erreicht werden kann. Der Trick besteht darin, beim Erstellen der DataTable alle Zeilen in einer Liste zu sammeln, zu sortieren und dann hinzuzufügen. Dieser Fall ist gerade hier aufgetaucht.


3

// Hoffe das wird dir helfen ..

        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

Verwenden Sie tableObject.Select(queryExpression, sortOrderExpression)diese Option, um Daten sortiert auszuwählen

Vollständiges Beispiel

Vollständiges Arbeitsbeispiel - kann in einer Konsolenanwendung getestet werden :

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

Ausgabe

Ausgabe


0

Versuche dies:

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) Sie müssen eine neue Tabelle erstellen DataTable sortedDT = new DataTable(). 2) Sie müssen verwenden ImportRow(Sie können keine Zeile aus einer anderen Tabelle hinzufügen)
marbel82
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.