この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
データテーブル*は、メモリ上において(主にデータベースの)テーブルを表すためのオブジェクトである。一般的にデータテーブルは、データベースから取得したレコード(行データ)を保持するのに使われる。
データテーブルのレコードをソート(並べ替え)したい場合には、データベースからレコードを取得するときに発行するSQL文(SELECT文)でソート条件を指定すれば、データテーブル内のレコードはソートされた状態となる。
しかし、複数の検索結果を1つのデータテーブルにマージした場合や、データベース以外のデータソースからデータテーブルを作成した場合などにもレコードをソートしたいなら、データテーブル上でソートを行う必要がある。本稿ではこの方法について解説する。
* DataTableクラス(System.Data名前空間)のオブジェクト。詳細については「ADO.NET基礎講座:第4回 データセットを使ったデータベース・アクセス」を参照。
データテーブル自体にはソート機能が用意されていない。このためデータテーブルをソートするには、まず空のデータテーブルを作成し、そこにソート済みのレコードを順に挿入していくことになる。
レコードのソートについては、データビュー(DataViewクラス(System.Data名前空間)のオブジェクト)を利用して、ソートされたデータテーブルの「ビュー」を作成すればよい。
具体的には次図のような手順によりデータテーブルをソートすることができる。
(1)のデータテーブルのコピーについては、DataTableクラスのCloneメソッドにより行える。このメソッドは、新しいデータテーブルのインスタンスを作成し、元のデータテーブルの構造のみをコピーする。
また、(3)のレコードのコピーについては、DataTableクラスのImportRowメソッドが利用できる。データビューの各レコードは、レコードのビューであるDataRowViewオブジェクト(System.Data名前空間)として扱われるが、そのRowプロパティにより、元のデータテーブルにあるレコードであるDataRowオブジェクト(System.Data名前空間)にアクセスできる。
次のサンプル・プログラムは実際にデータテーブルを作成し、ソートを行っている例だ。
このプログラムでは、@ITのRSS情報を読み取ってデータテーブルを作成している。このRSS情報の読み取りについては「TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには?」の後半部分で解説しているので、そちらを参照していただきたい。
// dtsort.cs
using System;
using System.Data;
public class DataTableSort {
static void ShowTable(DataTable dt) {
Console.WriteLine("--------------------");
foreach (DataRow dr in dt.Rows) {
string s1 = dr["date"].ToString().Substring(0, 10);
string s2 = dr["title"].ToString();
Console.WriteLine("{0} {1}", s1, s2);
}
Console.WriteLine("--------------------\n");
}
static void Main() {
// @ITのRSS情報からデータテーブルを作成
DataSet ds = new DataSet();
ds.ReadXml("http://atmarkit.itmedia.co.jp/rss/fdotnet/rss2dc.xml");
DataTable dt = ds.Tables["item"];
ShowTable(dt);
// 出力例:
// --------------------
// 2005-10-12 可変性を管理したモデル駆動型開発の例
// 2005-10-08 ASP.NETで実践するO/Rマッピング(iBA……
// 2005-10-07 .NET TIPS - .NET開発のテクニックとヒ……
// ……
// 2005-09-14 複雑なオブジェクトでもすぐに中身が見……
// 2005-09-10 新グリッド・コントロールの豊富な機能……
// 2005-09-09 .NET TIPS - .NET開発のテクニックとヒ……
// --------------------
// データテーブルのコピーを作成
DataTable dt2 = dt.Clone();
ShowTable(dt2); // 行がないことを確認
// 出力例:
// --------------------
// --------------------
// ソートされたデータビューの作成
DataView dv = new DataView(dt);
dv.Sort = "date";
// ソートされたレコードのコピー
foreach (DataRowView drv in dv) {
dt2.ImportRow(drv.Row);
}
ShowTable(dt2);
// 出力例:
// --------------------
// 2005-09-09 .NET TIPS - .NET開発のテクニックとヒ……
// 2005-09-10 新グリッド・コントロールの豊富な機能……
// 2005-09-14 複雑なオブジェクトでもすぐに中身が見……
// ……
// 2005-10-07 .NET TIPS - .NET開発のテクニックとヒ……
// 2005-10-08 ASP.NETで実践するO/Rマッピング(iBA……
// 2005-10-12 可変性を管理したモデル駆動型開発の例
// --------------------
}
}
// コンパイル方法:csc dtsort.cs
' dtsort.vb
Imports System
Imports System.Data
Public Class DataTableSort
Shared Sub ShowTable(dt As DataTable)
Console.WriteLine("--------------------")
For Each dr As DataRow In dt.Rows
Dim s1 As String = dr("date").ToString().Substring(0, 10)
Dim s2 As String = dr("title").ToString()
Console.WriteLine("{0} {1}", s1, s2)
Next
Console.WriteLine("--------------------")
Console.WriteLine()
End Sub
Shared Sub Main()
' @ITのRSS情報からデータテーブルを作成
Dim ds As DataSet = New DataSet()
ds.ReadXml("http://atmarkit.itmedia.co.jp/rss/fdotnet/rss2dc.xml")
Dim dt As DataTable = ds.Tables("item")
ShowTable(dt)
' 出力例:
' --------------------
' 2005-10-12 可変性を管理したモデル駆動型開発の例
' 2005-10-08 ASP.NETで実践するO/Rマッピング(iBA……
' 2005-10-07 .NET TIPS - .NET開発のテクニックとヒ……
' ……
' 2005-09-14 複雑なオブジェクトでもすぐに中身が見……
' 2005-09-10 新グリッド・コントロールの豊富な機能……
' 2005-09-09 .NET TIPS - .NET開発のテクニックとヒ……
' --------------------
' データテーブルのコピーを作成
Dim dt2 As DataTable = dt.Clone()
ShowTable(dt2) ' 行がないことを確認
' 出力例:
' --------------------
' --------------------
' ソートされたデータビューの作成
Dim dv As DataView = New DataView(dt)
dv.Sort = "date"
' ソートされたレコードのコピー
For Each drv As DataRowView in dv
dt2.ImportRow(drv.Row)
Next
ShowTable(dt2)
' 出力例:
' --------------------
' 2005-09-09 .NET TIPS - .NET開発のテクニックとヒ……
' 2005-09-10 新グリッド・コントロールの豊富な機能……
' 2005-09-14 複雑なオブジェクトでもすぐに中身が見……
' ……
' 2005-10-07 .NET TIPS - .NET開発のテクニックとヒ……
' 2005-10-08 ASP.NETで実践するO/Rマッピング(iBA……
' 2005-10-12 可変性を管理したモデル駆動型開発の例
' --------------------
End Sub
End Class
' コンパイル方法:vbc /r:System.Data.dll /r:System.dll /r:System.Xml.dll dtsort.vb
プログラムでは、元のデータテーブル、Cloneメソッドにより作成したデータテーブル、そしてソートされたレコードを含むデータテーブルの内容を表示している。ここでは日付の列(列名「data」)でソートを行っており、もともと降順でソートされていたレコードが昇順でソートされたのが分かる。
なお、本稿はあくまでデータテーブル内のレコードのソート方法について述べたものであり、ソートされたレコードをDataGridコントロールなどに表示したいだけであれば、ソートされたデータビューをコントロールに連結するだけでよい(参考「.NET TIPS:DataGridコントロールで並び替え順やフィルタを指定するには?」)。
カテゴリ:データベース 処理対象:データテーブル
使用ライブラリ:DataTableクラス(System.Data名前空間)
使用ライブラリ:DataViewクラス(System.Data名前空間)
使用ライブラリ:DataRowViewクラス(System.Data名前空間)
関連TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには?
関連TIPS:DataGridコントロールで並び替え順やフィルタを指定するには?
Copyright© Digital Advantage Corp. All Rights Reserved.