気楽なソフト工房

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



mykonos2008

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

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
さて、本日の記事から複数回に分けてクエリの文法を紹介していきます。
本日はfrom句とselect句です。サンプルのデータソースには1回目の記事で使用したPersonクラスの配列を使用します。

    class Program
    {
        private Person[] persons = null;

        Program()
        {
            //クエリのデータソースを初期化する
            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}
            };
        }
    }


from句
from句はデータを抽出する元となるデータソースを指定するための構文で、「from A in B」の形をとります。
またクエリは必ずfrom句から始まっている必要があります。

Aは「範囲変数」と呼ばれるもので、クエリ式の中で、これを利用して条件を指定したり、並び順を指定したりします。

Bにはデータソースを指定します。データソースは、IEnumerable、または、IEnumerable(T)またはその派生型である必要があります。
身近なところで言うと配列やArrayList、List(T)クラスなどがあります。

select句
select句はクエリの実行結果を列挙する際の値の型を指定するためのものです。

クエリを格納する変数の型はIEnumerable(T)になりますが、クエリの結果を取得する際には、
この型のインスタンスからforeach構文を使って値を列挙します。select句で指定するものは、
foreach文が返す値、すなわちforeach(A in B)のAの型を指定するためのものです。

さて、from句とselect句を説明したところで、以下のサンプルを見て下さい。
from句とselect句からなるシンプルなクエリを実行しています。

   void SelectAll()
   {
       IEnumerable<Person> = from person in persons
                   select person;

       foreach (Person person in query)
       {
           Console.WriteLine("{0}-{1}-{2}", person.LastName, person.FirstName, person.Age);
       }
   }

from句でpersonsという配列をデータソースとして指定し、範囲変数としてpersonを記述しています。
select句には範囲変数「person」をそのまま記述しています。クエリ結果を列挙するforeach文の繰り返し変数が
Person型になっていて、範囲変数「person」の型と一致していることが分かると思います。

また、以下のようにすることで、列挙される値を名前だけにすることも出来ます。

   void SelectFirstNameAll()
    {
        IEnumerable<String> query = from person in persons
                    select person.FirstName;

        foreach (String name in query)
        {
            Console.WriteLine("{0}", name);
        }
    }

selectにはメソッドを指定することも出来ます。

   void SelectFirstNameAll()
   {
       IEnumerable<String> query = from person in persons
                                   select String.Format("{0}さん", person.FirstName);

       foreach (String name in query)
       {
           Console.WriteLine("{0}", name);
       }
   }

varについて
上記で紹介してSelectAll()は以下にように記述することが可能です。

   void SelectAll()
   {
       var query = from person in persons
                   select person;

       foreach (var person in query)
       {
           Console.WriteLine("{0}-{1}-{2}", person.LastName, person.FirstName, person.Age);
       }
   }

[var]はC#3.0から導入されたキーワードで、ローカル変数を宣言する際に使用できるものです。
varで宣言された変数は同時に初期化される必要があります。そして、初期化時に設定された値の型によって
暗黙的に型指定がなされます。

上記の例で言うと変数宣言の述語(クエリの部分)の型がIEnumerable<Person>であるため、
変数queryはIEnumerable<Person>として暗黙的に型指定されます。

これはJavaScriptの変数のようにどの型も受け付けるといったようなものであは有りません。
上記のサンプルに以下のような一行を加えると、コンパイルエラーになってしまいます。

   void SelectAll()
   {
       var query = from person in persons
                   select person;

       foreach (var person in query)
       {
           Console.WriteLine("{0}-{1}-{2}", person.LastName, person.FirstName, person.Age);
       }

        query = "test";
   }

変数クエリは宣言時に暗黙的にIEnumerable<Person>として型指定されているため、その変数に対して他の型を持つ
値を代入することは出来ません。

次回はwhere句を説明します。

コメント

コメントの投稿

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

トラックバック

http://csfun.blog49.fc2.com/tb.php/64-8e0b23e7

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