VB.NET List(T) 任意の項目を削除・抽出・変換する

独自に定義したクラスを格納した List(T) で任意の項目を削除・抽出・変換する方法について説明しています。

.NET Framework 3.0 以降ではラムダ式を使用してシンプルに記載することができるようになりましたので、ここではラムダ式を使用して、独自クラスの List(T) に対して任意の項目を削除・抽出・変換してみます。

まずは、独自に定義したクラスですが、ここでは単純に ID と Name をプロパティに持つクラスを使用します。

    Public Class Employee
        
        Public Property ID As Integer
        Public Property Name As String
        
        Public Sub New(ByVal id As IntegerByVal name As String)
            Me.ID = id
            Me.Name = name
        End Sub
        
    End Class

適当なデータを作成して、それぞれ削除・抽出・変換を行っていますが、すべて1行で書く事ができます。

        ' ~ 適当なデータをList(T)と配列に格納する ~ 
        Dim list As New List(Of Employee)()
        list.Add(New Employee(2, "William Henry Gates"))
        list.Add(New Employee(3, "Steven Paul Jobs"))
        list.Add(New Employee(1, "Lawrence Edward Larry Page"))
         
        ' リストをID順でソートする
        list.Sort(Function(a, b) a.ID - b.ID)
         
        ' 結果、下記の順にソートされます
        ' ID=1 Name=Lawrence Edward Larry Page
        ' ID=2 Name=William Henry Gates
        ' ID=3 Name=Steven Paul Jobs
         
        ' List<string>に変換する
        Dim s As List(Of String) = list.ConvertAll(Function(x) String.Format("ID={0} Name={1}", x.ID, x.Name))
         
        ' 結果、下記のList<string>に変換されます
        ' "ID=1 Name=Lawrence Edward Larry Page"
        ' "ID=2 Name=William Henry Gates"
        ' "ID=3 Name=Steven Paul Jobs"
         
        ' IDが奇数の項目を抽出する
        Dim oddList As List(Of Employee) = list.FindAll(Function(x) x.ID Mod 2 <> 0)
         
        ' 結果、下記の項目が抽出されます
        ' ID=3 Name=Steven Paul Jobs
        ' ID=1 Name=Lawrence Edward Larry Page
         
        ' 名前の長さが20文字未満の項目を削除する
        list.RemoveAll(Function(x) x.Name.Length < 20)
         
        ' 結果、下記の項目が削除されます
        ' ID=2 Name=William Henry Gates
        ' ID=3 Name=Steven Paul Jobs

ラムダ式の部分が良く分からない方の為に、ラムダ式を使わない書き方も紹介します。まず、それぞれ変換や抽出を行うメソッドを用意します。それぞれの引数や戻り値はMSDNを参照してください。

    ''' <summary>
    ''' 文字列に変換
    ''' </summary>
    Private Function ConvertToString(x As EmployeeAs String
        Return String.Format("ID={0} Name={1}", x.ID, x.Name)
    End Function
         
    ''' <summary>
    ''' IDが奇数?
    ''' </summary>
    Private Function IsOddID(x As EmployeeAs Boolean
        Return x.ID Mod 2 <> 0
    End Function
         
    ''' <summary>
    '''  名前の長さが20文字未満?
    ''' </summary>
    Private Function IsShortName(x As EmployeeAs Boolean
        Return x.Name.Length < 20
    End Function

ConvertAll(), FindAll(), RemoveAll(), の引数にそれぞれ上で定義したメソッドを指定します。

        ' List<string>に変換する
        Dim stringList As List(Of String) = employeeList.ConvertAll(AddressOf ConvertToString)
         
        ' IDが奇数の項目を抽出する
        Dim oddList As List(Of Employee) = employeeList.FindAll(AddressOf IsOddID)
         
        ' 名前の長さが20文字未満の項目を削除する
        employeeList.RemoveAll(AddressOf IsShortName)

ラムダ式の部分はこれらと全く等価のコードになります。ソースコード中に何度も同じ比較を行う場合はメソッドを用意し、1度しか使用されない場合はラムダ式を使って簡潔に記載するのが良いと思われます。

参考:独自クラスの配列や List(T) を任意にソートする
使用環境: Visual Studio 2010 .NET Framework 3.0 以降