C# で DataTable をフィルター処理する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. DataView.RowFilter プロパティを使用して C#DataTable をフィルター処理する
  2. CopyToDataTable() メソッドを使用して、C#DataTable をフィルタリングする
  3. Select() メソッドを使用して、C#DataTable をフィルタリングする
C# で DataTable をフィルター処理する

.NET Framework の DataView は、フィルタリング用の databindtable を表します。これは、C# の DataTable のカスタマイズされたビューを表します。 DataTable (DataView が同期または接続されている) には、フィルタリングが必要なデータが含まれています。

DataView はデータを格納できず、対応する DataTable のデータのみを表します。 DataView で実行されるすべての計算は、DataTable に影響を与えます。

さらに、DataTable のデータを変更または修正すると、関連付けられているか接続されているすべての DataViews に影響します。

DataView クラスは、C# の System.Data 名前空間に存在します。 このチュートリアルでは、C# で DataTable をフィルター処理する 3つの主な方法を説明します。

DataView.RowFilter プロパティ、CopytoDataTable() および Select() メソッドは、C# で DataTable をフィルター処理する主要な方法です。 データが大きくなり、高レベルの操作が必要になるため、フィルタリングはすべての C# アプリケーションに共通の要件です。

DataView.RowFilter プロパティを使用して C#DataTable をフィルター処理する

DataView.RowFilter プロパティは、C# で DataTable をフィルタリングする場合に非常に効果的です。 DataView に関連付けられたデータを取得または設定することができ、各 DataTable のデータをフィルタリングできる個々の DataView オブジェクトを定義するのに役立ちます。

RowFilter プロパティは、行をフィルター処理する方法を指定する文字列を表し、その文字列の値のデータ型は System.String です。 RowFilter 値を username = "aUsername" として割り当て、DataView の行をフィルター処理して、フィルター処理されたデータを C# アプリケーションでプログラム的に表示できます。

RowFilter プロパティの最も興味深い点は、DataView が動的ビューを提供する、基礎となる DataTable のデータを変更/フィルター処理する機能です。 DataView の動的およびデータ バインディング機能により、データ バインディング C# アプリケーションに最適です。

DataTable によって提供されるビューと同様に、C# の DataView は単一のデータ セットを動的に表すことができ、さまざまなフィルターを実行できます。 RowFilter プロパティを DataView に適用できます。これにより、関連する DataTable オブジェクトの行コレクションの、フィルター式または条件に一致しない不要なデータがすべて非表示になります。

using System;
using System.Data;
using System.Windows.Forms;

namespace DataTableExp {
  public partial class Form1 : Form {
    private DataSet dtSet;

    public Form1() {
      InitializeComponent();
      CreateTable();
    }

    private void CreateTable() {
      // Create a new DataTable.
      DataTable filterExpCust = new DataTable("FilterUserDataTable");
      DataColumn filterExpColumn;
      DataRow filterExpDRow;

      // create an `id` column
      filterExpColumn = new DataColumn();
      // define the column's type
      filterExpColumn.DataType = typeof(Int32);
      filterExpColumn.ColumnName = "id";  // column name
      filterExpColumn.Caption = "User Account `ID`";
      filterExpColumn.ReadOnly = false;
      filterExpColumn.Unique = true;

      // Add column to the DataColumnCollection.
      filterExpCust.Columns.Add(filterExpColumn);

      // create a `name` column
      filterExpColumn = new DataColumn();
      filterExpColumn.DataType = typeof(String);
      filterExpColumn.ColumnName = "Name";  // column name
      filterExpColumn.Caption = "User Account `Name`";
      filterExpColumn.AutoIncrement = false;
      filterExpColumn.ReadOnly = false;
      filterExpColumn.Unique = false;

      // Add column to the DataColumnCollection.
      filterExpCust.Columns.Add(filterExpColumn);

      // create an `address` column
      filterExpColumn = new DataColumn();
      filterExpColumn.DataType = typeof(String);
      filterExpColumn.ColumnName = "Address";  // column name
      filterExpColumn.Caption = "User Account Address";
      filterExpColumn.ReadOnly = false;
      filterExpColumn.Unique = false;

      // add colume to the `filterExpColumn`
      filterExpCust.Columns.Add(filterExpColumn);

      // make the `id` the primary key of the table
      DataColumn[] PrimaryKeyColumns = new DataColumn[1];
      PrimaryKeyColumns[0] = filterExpCust.Columns["id"];
      filterExpCust.PrimaryKey = PrimaryKeyColumns;

      // create a new DataSet
      dtSet = new DataSet();

      // add `FilterUserDataTable` table to the DataSet.
      dtSet.Tables.Add(filterExpCust);

      // add data rows to the `FilterUserDataTable` table using the `NewRow` method

      // first user details
      filterExpDRow = filterExpCust.NewRow();
      filterExpDRow["id"] = 1001;
      filterExpDRow["Name"] = "Stephan Hawking";
      filterExpDRow["Address"] = "79 Gulberg Road, Havana, Cuba";
      filterExpCust.Rows.Add(filterExpDRow);

      // second user details
      filterExpDRow = filterExpCust.NewRow();
      filterExpDRow["id"] = 1002;
      filterExpDRow["name"] = "John Snow";
      filterExpDRow["Address"] = " The Kings Landing, North California";
      filterExpCust.Rows.Add(filterExpDRow);

      // third user details
      filterExpDRow = filterExpCust.NewRow();
      filterExpDRow["id"] = 1003;
      filterExpDRow["Name"] = "Scooby Doo";
      filterExpDRow["Address"] = "194 St. Patrick Avenue, London, UK";
      filterExpCust.Rows.Add(filterExpDRow);
    }

    private void button2_Click(object sender, EventArgs e) {
      // Create a BindingSource
      BindingSource bs = new BindingSource();
      bs.DataSource = dtSet.Tables["FilterUserDataTable"];

      // Bind data to DataGridView.DataSource
      dataGridView1.DataSource = bs;
    }

    private void button1_Click(object sender, EventArgs e) {
      // filter the datatable
      // create a customers table and access it into a `dv` DataView
      DataView dv = new DataView(dtSet.Tables["FilterUserDataTable"]);

      // it will filter the row where `id` is `1001`
      dv.RowFilter = "id = 1001";

      // output the filtered datatable in a `dataGridView1` data grid view
      dataGridView1.DataSource = dv;
    }
  }
}

出力:

*click `button2` to bind data to a data grid view*
*click `button2` to filter datatable*

id        Name                Address
1001      Stephan Hawking     79 Gulberg Road, Havana, Cuba

CreateTable() メソッドは、idname、および address 列を含む FilterUserDataTable データテーブルを作成します。 button2 ボタンは、この DataTable のデータを dataGridView1 にバインドできます。

button1 を押して DataTable をフィルタリングし、フィルタリングされた結果を dataGridView1 に表示します。

CopyToDataTable() メソッドを使用して、C#DataTable をフィルタリングする

DataTable をフィルタリングして、DataView ではなく新しい DataTable で結果を返すことができます。 その結果、新しい DataTable には DataRow オブジェクトのコピーが含まれ、入力 IEnumberable<T> オブジェクトが与えられます。

DataTable のソース IEnumerable<T>null にすることはできません。 そうしないと、新しい DataTable を作成できません。 DataTable を選択し、その内容を DataGridView のプロキシとして機能する BindingSource にバインドされた新しいものにコピーするクエリに基づいています。

private void button1_Click(object sender, EventArgs e) {
  DataTable _newFilteredDataTable =
      dtSet.Tables["FilterUserDataTable"].Select("id = 1001").CopyToDataTable();
  dataGridView1.DataSource = _newFilteredDataTable;
}

出力:

*click `button2` to bind data to a data grid view*
*click `button2` to filter datatable*

id        Name                Address
1001      Stephan Hawking     79 Gulberg Road, Havana, Cuba

_newFilteredDataTable は、FilterUserDataTable DataTable のフィルタリングされたデータを保持します。ここで、id = 1001 です。 この C# コードは、この button1_Click イベント コードを貼り付けることにより、前の C# の例で実行できます。

Select() メソッドを使用して、C#DataTable をフィルタリングする

Select() メソッドは、DataTable のシーケンスの各要素を新しいフォームに射影します。 これは System.Linq 名前空間に属しているため、LINQ を使用して C# の DataTable からフィルター処理されたデータを取得することを楽しんでいる開発者にとっては朗報です。

このメソッドはオブジェクトを戻り値として利用し、アクションの実行に必要なすべての情報を格納します。 1つの文字列引数を使用して DataRow オブジェクトのデータの配列を取得します。これがこの場合の条件です。

DataTable を照会するパラメーターとして条件を指定して Select() メソッドを使用できます。結果を取得した後、それを反復処理して必要なフィールドを出力できます。 DataTable.Select() 式を使用して、フィルター行を配列または DataTable に割り当てます。

言い換えれば、DataTableSelect() メソッドはフィルターを受け取り、引き換えに引数をソートし、それらを DataRow オブジェクトの配列に転送します。 フィルタリングされた DataTable 行を含む DataRow オブジェクトは、FilterExpression の条件を確認します。

// `dataTable` is the targeted DataTable in a C# program which contains data
// use `Select("id > 30")` to filter the data from `dataTable` where `id` is greater than `30`
// the `filterResult` will contain the filtered information of the `dataTable`

DataRow[] filterResult = dataTable.Select("id > 30");

foreach (DataRow filterRow in filterResult) {
  Console.WriteLine("ID: {0} Name: {1} Address: {2}", filterRow[0], filterRow[1], filterRow[2]);
}

出力:

ID: 1003, Name: Scooby Doo, Address: 194 St. Patrick Avenue, London, UK

C# で大量のデータを扱う場合、DataTable は極めて重要な役割を果たします。 このチュートリアルでは、C# で DataTable をフィルター処理する 3つの異なる方法を説明しました。

DataTable をフィルタリングする方法は、DataTable からのデータのフェッチと操作において最適化され、効率的である必要があります。

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

関連記事 - Csharp DataTable