Enumerable.Last メソッドを利用して、Enumerable オブジェクトの最後の要素を取得するコードを紹介します。
Listなど、一つのオブジェクトに複数の値が格納される Collection型のオブジェクトで最後の要素を取得したい場合があります。オーソドックスな方法としては添え字などでアクセスすることもできますが、位置を指定したアクセス方法がないCollection型のオブジェクトもあります。Enumerable オブジェクトのLast メソッドを利用することで、要素の最初にアクセスでき、条件に一致しない場合は条件に一致するまで要素をスキップして手前に戻って処理することができます。
下図の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 last_item = ItemList.Last();
textBox1.Text += "最後の項目:" + last_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 last_item = ItemList.Last(first_last_proc);
textBox1.Text += "最後の項目:" + last_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 last_item = ItemList.Last((string value) => { return !(value == "ぺんぎんクッキー" || value == "しろくまアイス"); });
textBox1.Text += "最後の項目:" + last_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 last_item = ItemList.Last((value) => !(value == "ぺんぎんクッキー" || value == "しろくまアイス"));
textBox1.Text += "最後の項目:" + last_item + "\r\n";
}
}
}
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックすると下記のコードが実行されます。
前半部分ではListオブジェクトを作成し値を追加します。ListオブジェクトのLastメソッドを呼び出すと最初の要素の値を取得できます。
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 last_item = ItemList.Last();
textBox1.Text += "最後の項目:" + last_item + "\r\n";
}
[button1]をクリックした実行結果は下図です。最後の項目である「しろくまアイス」がテキストボックスに表示されます。
[button2]をクリックすると下記のコードが実行されます。
Lastメソッドの第一引数にメソッド名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 last_item = ItemList.Last(first_last_proc);
textBox1.Text += "最後の項目:" + last_item + "\r\n";
}
private bool first_last_proc(string value)
{
if (value == "ぺんぎんクッキー" || value == "しろくまアイス") {
return false;
}
else {
return true;
}
}
[button2]をクリックすると、「しろくまアイス」はスキップされ、その一つ手前の要素である「あひるサブレ」が最後の要素としてテキストボックスに表示されます。
[button3]をクリックすると下記のコードが実行されます。
button2と同じ処理のコードですが、Lastメソッドの第一引数にメソッド名を与えている部分をステートメント形式のラムダ式に変更しています。
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 last_item = ItemList.Last((string value) => { return !(value == "ぺんぎんクッキー" || value == "しろくまアイス"); });
textBox1.Text += "最後の項目:" + last_item + "\r\n";
}
[button3]をクリックします。button2クリック時と同じ動作になります。
[button4]をクリックすると下記のコードが実行されます。
button2,button3と同じ処理をするコードですが、Lastメソッドの第一引数に、式形式のラムダ式を与えています。
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 last_item = ItemList.Last((value) => !(value == "ぺんぎんクッキー" || value == "しろくまアイス"));
textBox1.Text += "最後の項目:" + last_item + "\r\n";
}
[button4]をクリックします。button2,button3と同様の動作になります。