独自に定義したクラスを格納した 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 Integer, ByVal 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 Employee) As String Return String.Format("ID={0} Name={1}", x.ID, x.Name) End Function ''' <summary> ''' IDが奇数? ''' </summary> Private Function IsOddID(x As Employee) As Boolean Return x.ID Mod 2 <> 0 End Function ''' <summary> ''' 名前の長さが20文字未満? ''' </summary> Private Function IsShortName(x As Employee) As 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) を任意にソートする