気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
今回の記事からC#3.0とNET Framework3.5から導入されたLINQの入門記事を連載していきたいと思います。

LINQとは「統合言語クエリ」と略されるもので、C#のコードの中にSQLに似た構文のクエリを記述し、それにより
配列など様々なデータの集合から検索や集計を行うことが出来るというものです。

今回はまずサンプルにより直感的にLINQに実感してもらえればと思います。

まず、人の氏名と年齢を管理するためのPersonクラスを定義します。

  class Person
  {
      public String LastName {  get;  set; }
      public String FirstName { get; set; }
      public int Age { get; set; }
  }

そして、Personクラスの配列を作成します。

  Person[] persons = new Person[]
  {
     new Person(){ LastName="Tanaka",FirstName = "ichiro", Age = 20},
     new Person(){ LastName = "Sato",FirstName = "Kazuhiro",Age = 25},
     new Person(){ LastName = "Wada",FirstName = "Takashi",Age = 30},
     new Person(){ LastName = "Asada",FirstName = "Kenji",Age = 40},
     new Person(){ LastName = "Tanaka",FirstName = "Tatsuta",Age = 26},
     new Person(){ LastName = "Yoshino",FirstName = "Taro",Age = 27}
  };

※同じくC#3.0から登場したオブジェクト初期化を使用してPersonクラスのインスタンス化を行っています。

次にこのPersonクラスの配列からLINQクエリを使用して、年齢の若い順にインスタンスを抽出し、氏名と年齢をコンソールに表示します。

     //LINQクエリ
     IEnumerable<Person> query = from person in persons
                  orderby person.Age
                  select person;

     //クエリを実行し、結果を列挙する
     foreach (Person person in query)
     {
          Console.WriteLine("{0} {1} Age:{2}", person.LastName, person.FirstName, person.Age);
     }

結果は以下のように表示されます。

Tanaka ichiro Age:20
Sato Kazuhiro Age:25
Tanaka Tatsuta Age:26
Yoshino Taro Age:27
Wada Takashi Age:30
Asada Kenji Age:40

LINQ以前のコードだと自作クラスをソートするのは少し面倒くさい作業でしたが、LINQを使うと
こんなに簡単にソート処理を行うことができます。

サンプルを使ってLINQを少しだけ解説します。(詳細は次回以降で。)
LINQクエリとは指定されたデータの集合(今回のサンプルでは配列)を列挙する方法を指定するものなのです。従って
クエリを受ける変数の型をIEnumerable<Person>と宣言しています。

※IEnumerableはforeach可能なクラスが実装するインターフェースです。

LINQクエリはSQLに慣れた方であれば何となく推測できると思いますが、少し詳しくを見ていきます。

まず、from句はデータの取得元を指定する部分で、[from A in B]という形をとります。Bにはforeachできるタイプの
もの(IEnumerable、IEnumerable<T>を実装するクラス)なら何でも指定可能です。Bをデータソースと言います。
AはBから順番に取り出されたものを格納する範囲変数と呼ばれるものです。

この範囲変数を使用して抽出条件を指定したり、並び順を指定したりします。
上記のサンプルでも、order by person.Ageのように使用していますよね。

orderby句は並び順を指定するためのものです。
select句はクエリの結果の型を指定するためのものです。上記サンプルをselect person.Ageとすると、年齢だけを
クエリの結果として返すようになります。

最初にも説明しましたようにLINQクエリはデータソースから各要素を列挙する方法を指定するためのもので、
列挙されたデータそのものではありません。

データの列挙自体はforeachを実行することにより始めて実行されます。

今回のサンプルでは、紹介しませんでしたがLINQクエリではwhere句、group句、join句などを使用し
高度なクエリを記述することが出来ます。

LINQクエリは通常のオブジェクトの他にデータベースやXMLに対してもクエリを実行することが可能ですが、
私としては最大の魅力はやっぱり通常のオブジェクトに対してクエリを実行できることだと思います。

個人的に作るプログラムではデータベースを使用しないケースも多いので、LINQの機能はとても重宝すると思います。

次回はLINQの基礎を説明します。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/61-9809fc21

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。