Enumerable.​First メソッド / List<T>.First メソッドを利用する - 最初の要素を取得する - C#

Enumerable.​First メソッドを利用して、Enumerable オブジェクトの最初の要素を取得するコードを紹介します。

概要

Listなど、一つのオブジェクトに複数の値が格納される Collection型のオブジェクトで最初の要素を取得したい場合があります。オーソドックスな方法としては添え字などでアクセスすることもできますが、位置を指定したアクセス方法がないCollection型のオブジェクトもあります。Enumerable オブジェクトのFirstメソッドを利用することで、要素の最初にアクセスでき、条件に一致しない場合は条件に一致するまで要素をスキップして処理することができます。

プログラム例

今回は IEnumerable インターフェイスを実装しているListクラスを利用してFirstメソッドを利用するサンプルを紹介します。

UI

下図のUIを作成します。複数行のテキストボックスにボタンを4つ配置します。

コード

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 FirstDemo
{
  public partial class FormListFirstLast : Form
  {
    public FormListFirstLast()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      List<string> ItemList = new List<string>();

      ItemList.Add("ぺんぎんクッキー");
      ItemList.Add("らくだキャラメル");
      ItemList.Add("くじらケーキ");
      ItemList.Add("ふくろうカステラ");
      ItemList.Add("あひるサブレ");
      ItemList.Add("しろくまアイス");

      string first_item = ItemList.First();
      textBox1.Text += "最初の項目:" + first_item +"\r\n";
    }

    private void button2_Click(object sender, EventArgs e)
    {
      List<string> ItemList = new List<string>();

      ItemList.Add("ぺんぎんクッキー");
      ItemList.Add("らくだキャラメル");
      ItemList.Add("くじらケーキ");
      ItemList.Add("ふくろうカステラ");
      ItemList.Add("あひるサブレ");
      ItemList.Add("しろくまアイス");

      string first_item = ItemList.First(first_last_proc);
      textBox1.Text += "最初の項目:" + first_item + "\r\n";
    }

    private bool first_last_proc(string value)
    {
      if (value == "ぺんぎんクッキー" || value == "しろくまアイス") {
        return false;
      }
      else {
        return true;
      }
    }

    private void button3_Click(object sender, EventArgs e)
    {
      List<string> ItemList = new List<string>();

      ItemList.Add("ぺんぎんクッキー");
      ItemList.Add("らくだキャラメル");
      ItemList.Add("くじらケーキ");
      ItemList.Add("ふくろうカステラ");
      ItemList.Add("あひるサブレ");
      ItemList.Add("しろくまアイス");

      string first_item = ItemList.First((string value) => { return !(value == "ぺんぎんクッキー" || value == "しろくまアイス"); });
      textBox1.Text += "最初の項目:" + first_item + "\r\n";
    }

    private void button4_Click(object sender, EventArgs e)
    {
      List<string> ItemList = new List<string>();

      ItemList.Add("ぺんぎんクッキー");
      ItemList.Add("らくだキャラメル");
      ItemList.Add("くじらケーキ");
      ItemList.Add("ふくろうカステラ");
      ItemList.Add("あひるサブレ");
      ItemList.Add("しろくまアイス");

      string first_item = ItemList.First((value) => !(value == "ぺんぎんクッキー" || value == "しろくまアイス"));
      textBox1.Text += "最初の項目:" + first_item + "\r\n";
    }
  }
}

実行結果と解説

上記のプロジェクトを実行します。下図のウィンドウが表示されます。

button1

[button1]をクリックすると下記のコードが実行されます。
前半部分ではListオブジェクトを作成し値を追加します。ListオブジェクトのFirstメソッドを呼び出すと最初の要素の値を取得できます。
private void button1_Click(object sender, EventArgs e)
{
  List<string> ItemList = new List<string>();

  ItemList.Add("ぺんぎんクッキー");
  ItemList.Add("らくだキャラメル");
  ItemList.Add("くじらケーキ");
  ItemList.Add("ふくろうカステラ");
  ItemList.Add("あひるサブレ");
  ItemList.Add("しろくまアイス");

  string first_item = ItemList.First();
  textBox1.Text += "最初の項目:" + first_item +"\r\n";
}

[button1]をクリックした実行結果は下図です。最初の項目である「ぺんぎんクッキー」がテキストボックスに表示されます。

button2

[button2]をクリックすると下記のコードが実行されます。
Firstメソッドの第一引数にメソッド名first_last_procを与えています。first_last_procメソッドでは、要素の値が"ぺんぎんクッキー"または"しろくまアイス"であった場合はfalseを返します。falseを戻り値として返した場合は、その要素は無効としその次の要素を処理し、メソッドでtrueが返る値を最初の要素して判定します。
private void button2_Click(object sender, EventArgs e)
{
  List<string> ItemList = new List<string>();

  ItemList.Add("ぺんぎんクッキー");
  ItemList.Add("らくだキャラメル");
  ItemList.Add("くじらケーキ");
  ItemList.Add("ふくろうカステラ");
  ItemList.Add("あひるサブレ");
  ItemList.Add("しろくまアイス");

  string first_item = ItemList.First(first_last_proc);
  textBox1.Text += "最初の項目:" + first_item + "\r\n";
}

private bool first_last_proc(string value)
{
  if (value == "ぺんぎんクッキー" || value == "しろくまアイス") {
    return false;
  }
  else {
    return true;
  }
}

[button2]をクリックすると、「ぺんぎんクッキー」はスキップされ、その次要素である「らくだキャラメル」が最初の要素としてテキストボックスに表示されます。

button3

[button3]をクリックすると下記のコードが実行されます。
button2と同じ処理のコードですが、Firstメソッドの第一引数にメソッド名を与えている部分をステートメント形式のラムダ式に変更しています。
private void button3_Click(object sender, EventArgs e)
{
  List<string> ItemList = new List<string>();

  ItemList.Add("ぺんぎんクッキー");
  ItemList.Add("らくだキャラメル");
  ItemList.Add("くじらケーキ");
  ItemList.Add("ふくろうカステラ");
  ItemList.Add("あひるサブレ");
  ItemList.Add("しろくまアイス");

  string first_item = ItemList.First((string value) => { return !(value == "ぺんぎんクッキー" || value == "しろくまアイス"); });
  textBox1.Text += "最初の項目:" + first_item + "\r\n";
}

[button3]をクリックします。button2クリック時と同じ動作になります。

button4

[button4]をクリックすると下記のコードが実行されます。
button2,button3と同じ処理をするコードですが、Firstメソッドの第一引数に、式形式のラムダ式を与えています。
private void button4_Click(object sender, EventArgs e)
{
  List<string> ItemList = new List<string>();

  ItemList.Add("ぺんぎんクッキー");
  ItemList.Add("らくだキャラメル");
  ItemList.Add("くじらケーキ");
  ItemList.Add("ふくろうカステラ");
  ItemList.Add("あひるサブレ");
  ItemList.Add("しろくまアイス");

  string first_item = ItemList.First((value) => !(value == "ぺんぎんクッキー" || value == "しろくまアイス"));
  textBox1.Text += "最初の項目:" + first_item + "\r\n";
}

[button4]をクリックします。button2,button3と同様の動作になります。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2018-10-09
iPentec all rights reserverd.