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を愛用
掲載日: 2016-07-15
iPentec all rights reserverd.