zukucode
主にWEB関連の情報を技術メモとして発信しています。

VB.NET ラムダ式(無名関数)の基本的な使い方

VB.NETのラムダ式(無名関数)の基本的な使い方を紹介します。

ラムダ式を利用すれば、配列やリストやデータテーブルなどをSQLの要領で簡単に宣言的に集計できます。

記事の最後に便利な使い方の例を紹介しています。

例えば以下のデータテーブルがあるとします。

IDNAMEPRICE
1りんご150
2ばなな100
3みかん30
4いちご200

例えばIDの最大値を取得したい場合、ラムダ式を使わない場合は以下のようにFor文やForEachで取得することが多いと思います。

Dim max As Integer = 0
For Each row As DataRow In dt.Rows
    If CInt(row("ID")) > max Then
        max = CInt(row("ID"))
    End If
Next

これを、ラムダ式を使用すると以下のように実装できます。

Dim max As Integer = dt.Rows.Cast(Of DataRow).Select(Function(row) CInt(row("ID"))).Max()

DataTableRowsListBoxListItemReoeaterRepeaterItemなど、ループ処理で回すような変数(列挙可能な変数)に対しては基本的に同じように使用できます。

まずは列挙する変数にCast(Of DataRow)のようにCast処理を実行します。

これはラムダ式を実行するための前準備と考えてよいです。

dt.Rows.Cast(Of DataRow) 'DataTable
lb.Rows.Cast(Of ListItem) 'ListBox
rep.Rows.Cast(Of RepeaterItem) 'Repeater

Castのあとに続けて、ラムダ式を指定します。

上記は以下のように書き換えることができます。

Dim max As Integer = dt.Rows.Cast(Of DataRow).Select(Function(row)
                                                         Return CInt(row("ID"))
                                                     End Function).Max()

Selectメソッドの引数にファンクションを指定します。

DataRowが1行づつパラメータとしてセットされ、ファンクションがDataRowの件数分実行されます。

ファンクションのReturn値(戻り値)がそれぞれのDataRowの結果となります。

上記の例だとReturn値はID列の値を帰しているため、結果は1,2,3,4となります。

結果1,2,3,4で次のメソッドMAX()が実行されます。

MAXは最大値を取得するメソッドなので、4が取得できます。

最大値ではなく、結果1,2,3,4を配列で取得したい場合はMAX()の代わりにToArray()を使用します。

また、リストで取得したい場合はToList()を使用します。

以下にいろいろな便利な使用例を紹介します。

絞り込み

行(要素)の絞り込みはSQLと同じようにWhereを使用します。

ラムダ式のReturn値がTrueの要素のみ取得されます。

PRICEが100以上のNAMEを配列で取得する」場合は以下のようになります。(わかりやすくするため_を使って複数行で記載しています)

Dim arr As String() = dt.Rows.Cast(Of DataRow) _
                        .Where(Function(row) CInt(row("PRICE")) >= 100) _
                        .Select(Function(row) row("NAME").ToString).ToArray()

存在チェック

存在チェックはAnyまたはAllを使用します。

Anyはラムダ式のReturn値がTrueの要素が1つでもある場合、Anyの結果がTrueになります。

Allはラムダ式のReturn値がすべてTrueの場合、Allの結果がTrueになります。

NAMEが「ばなな」の行が存在するかどうか」を判定する場合は以下のようになります。

Dim result As Boolean = dt.Rows.Cast(Of DataRow) _
                            .Any(Function(row) row("NAME").ToString = "ばなな")

「すべての行のPRICEが100以上かどうか」を判定する場合は以下のようになります。

Dim result As Boolean = dt.Rows.Cast(Of DataRow) _
                            .All(Function(row) CInt(row("PRICE")) >= 100)

関連記事

  • VB.NET YYYYMMDD形式の文字列を日付型に型変換する

    VB.NETでYYYYMMDD形式の文字列を日付型に型変換する方法を紹介します。最初にYYYY/MM/DDのように、年月日の区切りに/を追加します。/区切りの文字列にするとCDateで日付型に型変換で...


  • VB.NET 文字列の全角と半角の変換を行う

    VB.NETで文字列を全角→半角や半角→全角に変換するにはStrConv関数を使用します。StrConvの第1引数に対象文字列を指定し、第2引数に変換方法を指定します。


  • VB.NET TypeOfで変数の型判定・比較を行う

    VB.NETで変数の型をチェックするにはTypeOfを使用します。TypeOf チェックしたい変数名 Is 判定したい型の形式で指定します。


  • VB.NET StringBuilderの末尾の1文字を削除する

    StringBuilderで末尾の1文字だけ削除したいときは以下のようにします。位置の指定について、1文字目は0から始まるため、文字列の長さ(Length)-1の位置が末尾の位置となります。末尾の位置...


  • VB.NET 指定した文字列を削除する

    VB.NETで指定した文字列を削除する方法を紹介します。Replace関数は指定した文字列を別の文字列に置換する関数です。置換する文字列に空文字を指定すれば、指定した文字列が削除される形になります。J...


  • VB.NET ダブルクォーテーションを文字列として扱う方法

    VB.NETで文字列を扱うときは以下のようにダブルクォーテーションで囲います。文字列の中にダブルクォーテーションを含めたい場合は少し工夫が必要です。以下のようにダブルクォーテーションを2つにすれば1つ...


  • VB.NET 文字列を連結する便利な方法まとめ

    VB.NETでは文字列の連結は文字列同士を&で結合できます。Visual Studio 2015からの新機能として文字列補間が可能になりました。以下のように、文字列の前に$をつけることにより、文字列の...


  • VB.NET 文字列をカナ、全角半角、大文字小文字などを区別せずに比較する方法

    VB.NETで文字列をひらがなカタカナ、全角半角、大文字小文字を区別せずに、前方一致や部分一致で検索する方法をまとめて紹介します。例えばあいうえおという文字列にうえという文字列が含まれているかどうか判...


  • VB.NET バイト配列と文字列を相互変換する

    バイト配列を文字列を相互変換する方法を紹介します。データベースからblob型の値を取得した時や、アップロードされたファイルの中身を取得した時などはバイト配列で取得することが多いです。エンコード形式を指...


  • VB.NET 任意の区切り文字のある文字列を配列に変換する

    VB.NETで任意の区切り文字のある文字列を配列に変換する方法を紹介します。文字列を配列に変換するにはSplitを使います。文字列.Split(区切り文字)で配列に変換できます。区切り文字はCharで...