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.

Vidya Sagar
quelle

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();
Jay Riggs
quelle
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();
Ankita_systematix
quelle
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

Abdul
quelle
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.

Vishnu
quelle
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.

Brian Rogers
quelle
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

Gustavo Mori
quelle
@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";
ivg
quelle
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;
Zolfaghari
quelle
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.

Joshua
quelle
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;
Kumod Singh
quelle
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

Zameer
quelle
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;
Rand Shaban
quelle
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