データテーブルの行の並べ替え


146

次のDataTableように、には2つの列があります。

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

しかし、を使用せずに、でなくDataViewDataTableそれ自体をソートする必要がありますDataView

回答:


355

あなたがやりたいように思えるように、DataTableのインプレースソートを簡単に行うことはできないと思います。

元のDataTableから作成したDataViewから新しいDataTableを作成することができます。DataViewで必要な並べ替えやフィルターを適用し、DataView.ToTableメソッドを使用してDataViewから新しいDataTableを作成します。

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

10進数である価格の値に関して昇順の値が必要です。どうやってするの?
Ranjith Kumar

このアプローチは問題ないようです。しかし、それを直接行う方法はありませんか?なぜDataTable.sort( "by")がないのですか?
スチーム

28
ありがとう。ここで「occr desc」、「occr」は列名、「desc」は「降順」を意味することに注意してください。
user1032613 14

22
これは私のために働いたdataTable.DefaultView.Sort = "Col1、Col2、Col3"。少しきれいなコード。
サイ

7
@Saiと同様に、DataTable.DefaultView.Sortを直接変更できます。ビューを「分解」してテーブルを再作成する必要はありません。
ジョニー

40

これはあなたを助けます...

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

偉大な心は同じように考える。@JayRを読んだ後、私は同じ解決策を投稿しようとしていました。
Drew Chapin 2017年

Column_name cuzの場合、Jay Riggsの解決策で何が発生したのか混乱しました:)
Thameem


25

その簡単な使用.Select関数。

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

これで完了です... Happy Coding


OPのように、この並べ替えの側面のみに関心があり、結果をフィルター処理しない場合は、次のように指定できますSelect("", "CompanyName ASC")
タワブワキル

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)。
Gustavo Mori

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

Vidyaはoccrでテーブルを降順でソートしたいと考えています。上記の単純なコードが行うこと。これは、Jay Riggs(受け入れられた回答)が示したものとまったく同じですが、これは1行のコードで行われます。
ivg 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.