【やさしいC#】lesson11.1 LINQ

C#

LINQの仕組みを知る

  データを扱う際のトピックについてみていきましょう。
  C#ではデータに問合わせを行うLINQ(Language Integrated Query)と呼ばれるしくみが提供されています。
  LINQは一般的に普及しているデータベースを扱う際の構文と似た表記で、さまざまなデータに問合わせを行えるようになっています。

SQL

一般的に普及しているデータベースであるリレーショナルデータベース(RDB)を扱うための言語として、SQL(構造化問合せ言語)が使われています。LINQはSQLに似た構文んを持ち、データベースばかりでなく、配列・XMLなども含めた各種データを扱える仕様となています。

データを用意する

番号名前
2乗用車
3オープンカー
4トラック
車表

このような型が異なる複数のデータを配列で用意するためには、列名を指定しないvarを使うと便利です。

var 車表 = new[] {
          new{番号 = 2, 名前 = “乗用車”},
          new{番号 = 3, 名前 = “オープンカー”},
          new{番号 = 4, 名前 = “トラック”},
        };

  ここでは配列名として「車表」と言う日本語を使いました。型を指定する代わりにvarを使い、newの直後の型名も省略しています。
  varを使う場合には、このように必ず値を与えて初期化を行う必要があります。初期化を行ったあ値から自動的に適切な型が選択されるようになっているからです。ここでは列名をフィールド、行をその値としたオブジェクトの配列が作成されます。

すべてのデータを取り出す

  まず、すべてのデータを取り出したい場合には次の文を使います。

構文:LINQによる問合せ

IEnumerable型の変数 = from 範囲変数名 in 配列
select new {範囲変数名.列名, … };

IEnumerable qry = from K in 車表 select new {K.名前, K.番号};
実際にコードを作成してみましょう。

//sample1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace lesson11
{
    class sample1 : Form
    {
        private ListBox lbx;
        static void Main(string[] args)
        {
            Application.Run(new sample1());
        }
        public sample1()
        {
            this.Text = "lesson11 LINQ"; this.Width = 300; this.Height = 200;
            lbx = new ListBox();lbx.Dock = DockStyle.Fill;

            var 車表 = new[] {
                new{番号 = 2, 名前 = "乗用車"},
                new{番号 = 3, 名前 = "オープンカー"},
                new{番号 = 4, 名前 = "トラック"},
            };

            IEnumerable qry = from K in 車表 select new { K.名前, K.番号 };

            foreach (var tmp in qry)
            {
                lbx.Items.Add(tmp);
            }
            lbx.Parent = this;

        }
    }
}
実行画面

条件をつけて検索する

  データを問合せる際には、条件を指定して、条件に該当するデータだけを取り出すこともできます。このときには

where 条件

という指定を行います。

IEnumerable qry = from K in 車表
where K.番号 <= 3
select new { K.名前, K.番号 };

LINQで条件付きで検索する
//sample2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace lesson11
{
    class sample2 : Form
    {
        private ListBox lbx;
        static void Main(string[] args)
        {
            Application.Run(new sample2());
        }
        public sample2()
        {
            this.Text = "lesson11 LINQ"; this.Width = 300; this.Height = 200;
            lbx = new ListBox(); lbx.Dock = DockStyle.Fill;

            var 車表 = new[] {
                new{番号 = 2, 名前 = "乗用車"},
                new{番号 = 3, 名前 = "オープンカー"},
                new{番号 = 4, 名前 = "トラック"},
            };

            IEnumerable qry = from K in 車表 where K.番号 <= 3 select new { K.名前, K.番号 };

            foreach (var tmp in qry)
            {
                lbx.Items.Add(tmp);
            }
            lbx.Parent = this;

        }
    }
}
実行画面

並べ替えを行う

  Orderby 列名

昇順
IEnumerable qry = from K in 車表
where K.番号 <= 3
orderby K.番号
select new { K.名前, K.番号 };

降順
IEnumerable qry = from K in 車表
where K.番号 <= 3
orderby K.番号 descending
select new { K.名前, K.番号 };

//sample3.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace lesson11
{
    class sample3 : Form
    {
        private ListBox lbx;
        static void Main(string[] args)
        {
            Application.Run(new sample3());
        }
        public sample3()
        {
            this.Text = "lesson11 LINQ"; this.Width = 300; this.Height = 200;
            lbx = new ListBox(); lbx.Dock = DockStyle.Fill;

            var 車表 = new[] {
                new{番号 = 2, 名前 = "乗用車"},
                new{番号 = 3, 名前 = "オープンカー"},
                new{番号 = 4, 名前 = "トラック"},
            };

            IEnumerable qry = from K in 車表 where K.番号 <= 3 orderby K.番号 descending select new { K.名前, K.番号 };

            foreach (var tmp in qry)
            {
                lbx.Items.Add(tmp);
            }
            lbx.Parent = this;

        }
    }
}
LINQ並べ替えOrderby

コメント

タイトルとURLをコピーしました