LINQの利用 - クラスの配列に対してLINQを利用する - C#
クラスの配列に対してLINQを利用するコードを紹介します。
プログラム
UI
下図のUIを作成します。WindowsフォームにButtonコントロールとTextBoxコントロールを配置します。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ClassArrayLinq
{
public partial class FormMain : Form
{
public class ItemInfo
{
public int id;
public string name;
public decimal price;
}
ItemInfo[] ItemArray;
public FormMain()
{
InitializeComponent();
ItemArray = new ItemInfo[5];
ItemArray[0] = new ItemInfo();
ItemArray[0].id = 1;
ItemArray[0].name = "ペンギンクッキー";
ItemArray[0].price = 120;
ItemArray[1] = new ItemInfo();
ItemArray[1].id = 2;
ItemArray[1].name = "しろくまキャンディー";
ItemArray[1].price = 55;
ItemArray[2] = new ItemInfo();
ItemArray[2].id = 3;
ItemArray[2].name = "くじらケーキ";
ItemArray[2].price = 220;
ItemArray[3] = new ItemInfo();
ItemArray[3].id = 4;
ItemArray[3].name = "らくだサブレ";
ItemArray[3].price = 80;
ItemArray[4] = new ItemInfo();
ItemArray[4].id = 5;
ItemArray[4].name = "しまうまポテト";
ItemArray[4].price = 140;
}
private void button1_Click(object sender, EventArgs e)
{
IEnumerable<ItemInfo> query = from i in ItemArray where i.id > 2 select i;
//var query = from i in ItemArray where i.id > 2 select i; //こちらでもOK
//IEnumerable<ItemInfo> query = ItemArray.Where((i) => i.id > 2).Select((i) => i); //この書式もOK
foreach (ItemInfo n in query) {
textBox1.Text += string.Format("{0} : \\{1:g}\r\n", n.name, n.price);
}
}
}
}
解説
フォームの作成時に、ItemInfoクラスの配列である、ItemArray の初期化と値の設定を実行します。
[button1]クリック時にbutton1_Click()メソッドが実行されます。
下記のコードにより、ItemArray 配列から ItemInfoのidが2より大きい項目を取り出します。結果はqueryオブジェクト(変数)に格納されます。
IEnumerable<ItemInfo> query = from i in ItemArray where i.id > 2 select i;
LINQではSQL的な書式以外に下記のメソッド形式での記述もできます。"=>"はラムダ式の演算子です。詳細は
こちらの記事を参照してください。
IEnumerable<ItemInfo> query = ItemArray.Where((i) => i.id > 2).Select((i) => i);
括弧を省略した書式も可能です。
IEnumerable<ItemInfo> query = ItemArray.Where(i => i.id > 2).Select(i => i);
queryオブジェクトをforeachでループし、先のLINQで取得した結果の要素の情報をテキストボックスに表示します。今回の例では、LINQの結果にマッチしたItemInfoのname と price をテキストボックスに表示します。
foreach (ItemInfo n in query) {
textBox1.Text += string.Format("{0} : \\{1:g}\r\n", n.name, n.price);
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。ItemArray 内のItemInfoでidが2より大きい要素のname,price がテキストボックスに表示されます。
条件式を変える
先のプログラムに[button2]を追加します。
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ClassArrayLinq
{
public partial class FormMain : Form
{
public class ItemInfo
{
public int id;
public string name;
public decimal price;
}
ItemInfo[] ItemArray;
public FormMain()
{
InitializeComponent();
ItemArray = new ItemInfo[5];
ItemArray[0] = new ItemInfo();
ItemArray[0].id = 1;
ItemArray[0].name = "ペンギンクッキー";
ItemArray[0].price = 120;
ItemArray[1] = new ItemInfo();
ItemArray[1].id = 2;
ItemArray[1].name = "しろくまキャンディー";
ItemArray[1].price = 55;
ItemArray[2] = new ItemInfo();
ItemArray[2].id = 3;
ItemArray[2].name = "くじらケーキ";
ItemArray[2].price = 220;
ItemArray[3] = new ItemInfo();
ItemArray[3].id = 4;
ItemArray[3].name = "らくだサブレ";
ItemArray[3].price = 80;
ItemArray[4] = new ItemInfo();
ItemArray[4].id = 5;
ItemArray[4].name = "しまうまポテト";
ItemArray[4].price = 140;
}
private void button1_Click(object sender, EventArgs e)
{
/*
省略
*/
}
private void button2_Click(object sender, EventArgs e)
{
IEnumerable<ItemInfo> query = from i in ItemArray where i.price > 100 select i;
//var query = from i in ItemArray where i.price > 100 select i; //こちらでもOK
//IEnumerable<ItemInfo> query = ItemArray.Where((i) => i.price>100).Select((i) => i); //この書式もOK
foreach (ItemInfo n in query) {
textBox1.Text += string.Format("{0} : \\{1:g}\r\n", n.name, n.price);
}
}
}
}
解説
フォームの作成時に、ItemInfoクラスの配列である、ItemArray の初期化と値の設定を実行します。
[button1]クリック時にbutton1_Click()メソッドが実行されます。
下記のコードにより、ItemArray 配列から ItemInfoのpriceが100より大きい項目を取り出します。結果はqueryオブジェクト(変数)に格納されます。
IEnumerable<ItemInfo> query = from i in ItemArray where i.price > 100 select i;
SQL的な書式以外に下記のメソッド形式での記述もできます。"=>"はラムダ式の演算子です。詳細は
こちらの記事を参照してください。
IEnumerable<ItemInfo> query = ItemArray.Where((i) => i.price>100).Select((i) => i);
括弧を省略した書式も可能です。
IEnumerable<ItemInfo> query = ItemArray.Where(i => i.price>100).Select(i => i);
取得したqueryオブジェクトをforeachでループし、先のLINQで取得した結果の要素の情報をテキストボックスに表示します。こちらのコードは先に紹介したコードと同様です。
実行結果
プロジェクトを実行します。下図のフォームが表示されます。
[button2]をクリックします。ItemArray 内のItemInfoでpriceが100より大きい要素のname,price がテキストボックスに表示されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用