気楽なソフト工房

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



mykonos2008

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

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
本日は、LINQ入門の5回目で、orderby句です。

早速、サンプルを紹介していきます。データソースは前回までと同じく、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}
            };
        }
    }

まず、最初のサンプルは年齢の昇順で並び替えるサンプルです。

    void Sort()
    {
        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);
        }
    }

orderbyに続けて、範囲変数personのAge属性を指定します。SQLと同じように昇順、降順を指定することが出来ます。
昇順の場合は、範囲変数の後に、「ascending」を、降順の場合は、「descending」を指定します。
例) orderby person.Age descending

省略した場合は、ascendingを指定した場合と同じ動きになります。

orderbyはカンマで区切って複数指定することも出来ます。以下は、姓と名のぞれぞれ1文字目で並び替えるサンプルです。

   void SortComplex()
   {
       IEnumerable<Person> query = from person in persons
                                   orderby person.LastName.Substring(0, 1),person.FirstName.Substring(0, 1)
                                   select person;

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

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

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

where句と同様、並び替えをする属性を動的に変えたい場合が出てくると思います。
動的LINQを使う高度な方法もあるのですが、ここではこんな方法を考えてみました。
以下は、並べ替えに使用する属性を姓と名で切り替えるサンプルです。

まず、Personクラスにソート用のプロパティ「NameForOrder」を追加します。

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

        public String NameForOrder { get; set; }
    }

そして、クエリを実行する前に、「NameForOrder」に姓か名のいずれかの値を設定します。
クエリではorderby句に「NameForOrder」を指定します。

   void SortByName(bool lastOrFirst)
   {
       //ソート用の属性に値を設定する
       foreach (Person person in persons)
       {
           //姓の場合
           if (lastOrFirst)
           {
               person.NameForOrder = person.LastName;
           }
           //名の場合
           else
           {
               person.NameForOrder = person.FirstName;
           }
       }

       IEnumerable<Person> query = from person in persons
                                   orderby person.NameForOrder
                                   select person;

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

ソート用のプロパティを持たないといけないので、
無駄もあるのですが、動的LINQを使うより簡単に、並び替えの属性を変更することができます。

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

コメント

コメントの投稿

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

トラックバック

http://csfun.blog49.fc2.com/tb.php/71-f02bb90a

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