C#/VB.NETでforeach/For Eachの最後を簡単に判定する方法について解説します。
For eachの最後に処理を入れたいけど、どうやって判断するのが良いですか?
コレクションの最後をLastで判断することで簡単に最後を取得することができます。
foreach/For Eachの最後をLINQで判定する方法
配列やリストの最後のデータを取得するにはLINQのLastを利用すると簡単に要素を取得することができます。
要素が取得できれば、その要素とループの要素が同じか判定してやることで、ループの最後を判定することができます。他にも判定する方法はありますが、この方法が非常にシンプルに判定をすることができておすすめです。
コレクション.Last()
※VB.NetではIs演算子で判定することができます。
private void Form1_Load(object sender, EventArgs e)
{
List<string> list = new List<string>() {"a","b","c" };
foreach( var X in list)
{
if ( X == list.Last()) {
MessageBox.Show("最後は" + X);
}
}
}
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim list As New List(Of String)(New String() {"a", "b", "c"})
For Each X In list
If X Is list.Last Then
MsgBox("最後は" + X)
End If
Next
End Sub
Last()はリストが空の場合は例外が発生する
Last()はリストが空の場合、例外が発生してしまいます。上記のサンプルではループに入ることがないので問題ありませんが、ループの最後の判定以外でLastを利用する場合、空のリストが発生するようなプログラムの場合は、例外処理や、カウントによる判定を入れて例外の回避が必要です。
また、LastOrDefaultを利用することで、デフォルト値を取得することができるので、大抵の場合はこちらを使ったほうが便利です。
コレクション.LastOrDefault()
foreach/For Eachループ回数を取得して最後を判断する
foreach/For Eachループ回数を取得してコレクションをカウントして判定することもできます。
foreach/For Eachでは、現在処理している要素のインデックス番号を取得することができます。これを利用して、繰り返し処理中に最後の要素かどうかを判定することができます。
例えば、以下のようなリストがあった場合、
List<int> list = new List<int>{1, 2, 3, 4, 5};
Dim list As List(Of Integer) = New List(Of Integer) From {1, 2, 3, 4, 5}
以下のように、foreach文内で現在処理している要素がリストの最後の要素であるかどうかを判定することができます。
foreach (int i in list)
{
if (i == list[list.Count - 1])
{
// 最後の要素
}
else
{
// 最後の要素ではない
}
}
Dim last As Integer = list.Last()
For Each i As Integer In list
If i = last Then
' 最後の要素
Else
' 最後の要素ではない
End If
Next
「foreachのループ回数を取得する方法」については以下の記事も参考にしてみて下さい。
まとめ
C#/VB.NETでforeach/For Eachの最後を簡単に判定する方法について解説しました。
- foreach/For Eachの最後を判定する方法として、インデックスを使う方法とLINQのLastメソッドを使う方法がある。
- LINQのメソッドを使う方法では、最後の要素を取得し、それをforeach文の条件式で比較することができる。
- インデックスを使う方法では、foreach文内で現在処理している要素がリストの最後の要素かどうかを判定することができる。
ループの最後を取得することができました。
最後のループだけ異なった処理にしたい場合などに便利なので覚えておきましょう!
コメント