【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
 

.NET TIPS

[ADO.NET]データテーブル(DataTable)内のレコードをソートするには?

デジタルアドバンテージ 遠藤 孝信
2005/10/14

 データテーブル*は、メモリ上において(主にデータベースの)テーブルを表すためのオブジェクトである。一般的にデータテーブルは、データベースから取得したレコード(行データ)を保持するのに使われる。

 データテーブルのレコードをソート(並べ替え)したい場合には、データベースからレコードを取得するときに発行するSQL文(SELECT文)でソート条件を指定すれば、データテーブル内のレコードはソートされた状態となる。

 しかし、複数の検索結果を1つのデータテーブルにマージした場合や、データベース以外のデータソースからデータテーブルを作成した場合などにもレコードをソートしたいなら、データテーブル上でソートを行う必要がある。本稿ではこの方法について解説する。

* DataTableクラス(System.Data名前空間)のオブジェクト。詳細については「ADO.NET基礎講座:第4回 データセットを使ったデータベース・アクセス」を参照。

データビューを利用したデータテーブルのソート

 データテーブル自体にはソート機能が用意されていない。このためデータテーブルをソートするには、まず空のデータテーブルを作成し、そこにソート済みのレコードを順に挿入していくことになる。

 レコードのソートについては、データビュー(DataViewクラス(System.Data名前空間)のオブジェクト)を利用して、ソートされたデータテーブルの「ビュー」を作成すればよい。

 具体的には次図のような手順によりデータテーブルをソートすることができる。

データテーブルのソート手順
  データテーブルのコピーを作成する(レコードはコピーしない)。
  ソートされたデータビューをデータテーブルから作成する。
  作成したデータテーブルへデータビューのレコードをコピーする。

 のデータテーブルのコピーについては、DataTableクラスのCloneメソッドにより行える。このメソッドは、新しいデータテーブルのインスタンスを作成し、元のデータテーブルの構造のみをコピーする。

 また、のレコードのコピーについては、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://www.atmarkit.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
データテーブルをソートするC#のサンプル・プログラム(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://www.atmarkit.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
データテーブルをソートするVB.NETのサンプル・プログラム(dtsort.vb)

 プログラムでは、元のデータテーブル、Cloneメソッドにより作成したデータテーブル、そしてソートされたレコードを含むデータテーブルの内容を表示している。ここでは日付の列(列名「data」)でソートを行っており、もともと降順でソートされていたレコードが昇順でソートされたのが分かる。

 なお、本稿はあくまでデータテーブル内のレコードのソート方法について述べたものであり、ソートされたレコードをDataGridコントロールなどに表示したいだけであれば、ソートされたデータビューをコントロールに連結するだけでよい(参考「.NET TIPS:DataGridコントロールで並び替え順やフィルタを指定するには?」)。End of Article

カテゴリ:データベース 処理対象:データテーブル
使用ライブラリ:DataTableクラス(System.Data名前空間)
使用ライブラリ:DataViewクラス(System.Data名前空間)
使用ライブラリ:DataRowViewクラス(System.Data名前空間)
関連TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには?
関連TIPS:
DataGridコントロールで並び替え順やフィルタを指定するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールにソート機能を追加するには?
[ASP.NET]DataGridコントロールを階層表示させるには?
[ASP.NET]DataGridコントロールのソートを双方向にするには?
自作クラスによる配列をソート(並べ替え)するには?(LINQ版)
[ASP.NET]DataGridコントロールでデータセットを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

ホワイトペーパーTechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  TomcatやJBossなどAPサーバ環境に関する
情報を集約! “業務”用APサーバ大百科

New!
  一気に解説! 最新のクラスタストレージ
「RAIDを超えたストレージ基準」……など

New!
  クラウド的ユーザー体験の変化は脅威か?
仮想化技術を使いこなす運用管理術を紹介

New!

  上司や部下、部署内メンバーとの情報共有
を“ガラッ”と変えるコラボツールとは?

New!
  おばかアプリ選手権、第4弾開催中!!
ムダにカッコよくてくだらない作品求ム!

  社内ファイルサーバを“クラウド”に統合
VPN直結「クラウド型ストレージ」を紹介

  Twitterのアカウントはなぜ突破された?
メールによる新手の攻撃手法とその対策

  もう仮想化のお試しフェイズは終わりだ!
Hyper-V 2.0が基幹システムも仮想化

  美人!? まあまあ? 気になる いやし系!!
PV急増で「美人時計」がとった手段とは?

  クライアント企業から求められる人材
⇒IT技術と経営戦略を併せ持つ「戦略家」

  .NET編集長が実践する「技術情報検索術」
サンプル・コードを簡単に探す“技”は?

  業務効率と情報セキュリティ対策を両立!
手間なく確実に機密情報を守る方法とは?

  進化を続ける富士通ストレージETERNUS DX
製品開発者の自信を裏付けるものとは何か

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  【CTC事例】約30の基幹システムを統合!
膨大なバッジジョブを制御した方法は?

  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  その数、なんと400台以上! グループ内
サーバの「統合管理」によるメリットは?