ジョイ・オブ・プログラミング:LINQ(前編)

XMLを扱えるLINQ ―LINQ to XML― の基礎を学ぼう

シグマコンサルティング 菅原 英治
2008/04/18
Page1 Page2 Page3

サンプル・アプリケーションについて

 まずはわたしが作成したサンプル・アプリケーションについて簡単に説明します。今回作成したのは、記録したレストラン情報を検索できるレストラン検索アプリケーションです。

 わたしは、食べ歩きが趣味です。食べ歩いたレストラン情報を記録し、検索したいという思いから、このアプリケーションを思いつきました。

サンプル・アプリケーションを動かそう

 それでは、わたしが作成したアプリケーションを見てみましょう。こちらからアプリケーションをダウンロードし、任意のフォルダに解凍してください。その後、JoyOfLinq.exeを実行してください(実行には、.NET Framework 3.5の動作環境が必要)。下の図のような画面が表示されます。

 また、このアプリケーションのソース・コードは、こちらからダウンロードできます。

起動したサンプル・アプリケーションの画面
JoyOfLinq.exeを実行しているところ。
  [Id]を入力するテキストボックス。入力された値と等しいIdを持つ結果が一覧に表示される。
  [名前]を入力するテキストボックス。入力された値を含む名前の結果が一覧に表示される。
  [住所]を入力するテキストボックス。入力された値を住所の前方一致で検索し、一致する結果が一覧に表示される。
  [点数]を入力するテキストボックス。入力された値以上の得点の結果が一覧に表示される。
  [検索]ボタン。このボタンを押すと検索する。また、のテキストボックスで[Enter]キーを押すことでも検索できる。
  検索結果の一覧。条件に該当する結果が表示される。

 画面が表示されたら、どのテキストボックスにも値を入力しないで、[検索]ボタンを押してみてください。全レストランの一覧が表示されます。続いて、Idを入力するテキストボックスに半角数字で「3」と入力してください。Idが「3」に該当する結果が、1件表示されるはずです。そのほかのテキストボックスにも値を入力するなどして、さらに動作を確認してください。

 各テキストボックスに入力した条件は、AND条件となっています。例えば、住所を「東京都中」、点数を「70」とすると、住所が「東京都中」で始まり、かつ70点以上のものが検索されます。

 サンプル・アプリケーションの動作から、入力された条件を基に検索することができるアプリケーションであることを理解いただけたでしょう。

サンプル・アプリケーションで利用している技術

 サンプル・アプリケーションでは、当然ですが本稿のテーマでもあるLINQを利用しています。またXMLファイルからオブジェクトを生成するためにXmlSerializerも利用しています。さらに、本稿のテーマとは直接関係ないのですが、せっかくVisual Studio 2008を利用するので、画面は最新の描画技術であるWPF(Windows Presentation Foundation)を利用して作成しています。

 一方、LINQでXMLを利用する際には、LINQ to XMLを利用するのが標準的な方法です。これは具体的にはSystem.Xml.Linqクラスのことですが、今回のサンプルではこの方法は利用していません。しかしLINQ to XMLの基本的な利用方法は本稿の「LINQの基礎」の中で取り上げます。

LINQの基礎

 ここでは、LINQの基礎について解説します。これは、サンプル・アプリケーションのソース・コードを解説するに当たり、どうしても必要な知識となるからです。ここでは詳細な解説は避け、わたしが重要だと思われる点のみに絞って解説します。

 またLINQの詳細から学ばれたい方は、下記の記事とMSDNを参考にするとよいでしょう。

LINQとは:コレクションを操作する方法

 わたしの理解するところ、LINQとはひと言で、「コレクションを操作する方法」といえます。コレクションとは、配列やListジェネリック・クラスなど、オブジェクトの集合を表すものです。また操作とは、その集合に対し射影や選択、並べ替えなどを行うことです。「射影」や「選択」はデータベース用語です。射影とは、あるテーブルから特定の列(カラム)の値をすべて取り出す操作。選択とは、あるテーブルからある条件を満たす行(レコード)を選択的に取り出す操作です。

 今回は、LINQにより射影と選択を行う具体例を示します。具体例として記述するコードは、ぜひコンソール・アプリケーションを作成し、実際に試していただきたい。実際に記述することで、より理解が深まります。コンソール・アプリケーションの作成方法については、下記を参考にするとよいでしょう。

射影の例

 それでは、射影の例です。次のリスト1ではstring型の配列で定義した名前一覧から、名前の先頭2文字を射影しその結果を出力します。

// 名前の一覧をstring型の配列として定義する
string[] names =
  new string[] { "桑山又左衛門", "野瀬市之丞", "杉山忠兵衛" };

// 名前から先頭2文字を射影する
IEnumerable<string> queriedNames =
  from name in names
  select name.Substring(0, 2);

// 結果を出力する
foreach (string name in queriedNames)
  Console.WriteLine(name);
リスト1 先頭2文字を射影する例
ソースのダウンロードはこちらから。

 リスト1の実行結果は次のようになります。実行結果から、名前の先頭2文字が射影されたことが分かります。

桑山
野瀬
杉山
リスト1の実行結果

 さて、リスト1にはもう1点重要なポイントがあります。それは太字で示されたIEnumerable<string>の個所です。LINQによるクエリ式の実行結果は、クエリ式の射影(selectの部分)で指定した型のIEnumerableコレクションとなります。

 例えば、次のリスト2ではstring型である名前のLengthプロパティを射影しています。Lengthプロパティの値はint型なので、「IEnumerable<int>」の実行結果が返されていることが分かるでしょう。

// 名前文字数を射影する
IEnumerable<int> projectedLength =
  from name in names
  select name.Length;
リスト2 文字数を射影する例

 射影の例は以上です。

選択の例

 続いて選択の例です。次のリスト3ではstring型の配列で定義した名前一覧から、文字数が5文字より多いものを選択し、その結果を出力します。

// 名前の一覧をstring型の配列として定義する
string[] names =
  new string[] { "桑山又左衛門", "野瀬市之丞", "杉山忠兵衛" };

// 名前の文字数が5文字より多いものを選択する
IEnumerable<string> queriedNames =
  from name in names
  where name.Length > 5
  select name;

// 結果を出力する
foreach (string name in queriedNames)
  Console.WriteLine(name);
リスト3 名前の文字数が5文字より多いものを選択する
ソースのダウンロードはこちらから。

 リスト3の実行結果は次のようになります。実行結果から、名前の文字数が5文字より多いものが選択されたことが分かります。

桑山又左衛門
リスト3の実行結果

 選択の例は以上です。

 以上の例から、わたしがLINQとは「コレクションを操作する方法」、と述べた理由が理解できたでしょうか。また、LINQの実行結果は、IEnumerable型のコレクションである点は重要なポイントです。


 INDEX
  ジョイ・オブ・プログラミング:LINQ(前編)
  XMLを扱えるLINQ ―LINQ to XML― の基礎を学ぼう
    1.ジョイ・オブ・プログラミングの伝道師「ロブ」
  2.LINQの基礎
    3.LINQ to XMLについて
 
  ジョイ・オブ・プログラミング:LINQ(後編)
  LINQを活用した簡単XMLデータベース・アプリケーション
    1.サンプル・アプリケーションのソース解説
    2.LINQのWhere条件を動的に変更する方法

 ジョイ・オブ・プログラミング


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間