Arrayクラスには、述語(Predicate)を使った要素の検索や取得を行うメソッドがいくつか用意されています。 デリゲートとして条件を記述したものをこれらのメソッドに渡すことによって、その条件に見合う要素を検索・取得することが出来ます。
これらのメソッドを使うことにより、for文・foreach文で列挙してif文で各要素を条件と照らし合わせて検索するといった処理を、メソッドを呼び出すだけで済ませる事が出来るようになります。 言い換えるとfor文・foreach文による配列要素に対する繰り返し処理から、if文等による条件分岐等の処理をメソッド/デリゲートとして分離することができます。
Arrayクラスには、述語を使った要素の検索・取得を行うことが出来るメソッドとして次のようなものが用意されています。
メソッド | 機能 |
---|---|
Find | 述語で定義された条件と一致する最初の要素を取得する |
FindLast | 述語で定義された条件と一致する最後の要素を取得する |
FindAll | 述語で定義された条件と一致するすべての要素を取得する |
FindIndex | 述語で定義された条件と一致する最初の要素のインデックスを取得する |
FindLastIndex | 述語で定義された条件と一致する最後の要素のインデックスを取得する |
Exists | 述語で定義された条件と一致する要素があるかどうかを判断する |
TrueForAll | 述語で定義された条件とすべての要素が合致するかどうかを判断する |
次の例では、値が偶数かどうかを返すメソッドを作成し、それを述語として使用することで配列内にある偶数の要素を検索・取得しています。
述語を使って配列内の要素を検索する
Imports System
Class Sample
' 引数で与えられた数が偶数かどうか
Shared Function IsNumberEven(ByVal val As Integer) As Boolean
If val Mod 2 = 0 Then
Return True
Else
Return False
End If
End Function
Shared Sub Main()
Dim arr() As Integer = {1, 4, 3, 5, 2, 6}
' 「値が偶数かどうか」という述語となるデリゲート
Dim isEven As Predicate(Of Integer) = AddressOf IsNumberEven
' 値が偶数の要素とそのインデックスを取得
Console.WriteLine("Find: {0}", Array.Find(arr, isEven))
Console.WriteLine("FindIndex: {0}", Array.FindIndex(arr, isEven))
Console.WriteLine("FindLast: {0}", Array.FindLast(arr, isEven))
Console.WriteLine("FindLastIndex: {0}", Array.FindLastIndex(arr, isEven))
' 値が偶数の要素をすべて取得
Console.Write("FindAll: ")
For Each elem As Integer In Array.FindAll(arr, isEven)
Console.Write("{0}, ", elem)
Next
Console.WriteLine()
' 値が偶数の要素が存在するかどうか
Console.WriteLine("Exists? {0}", Array.Exists(arr, isEven))
' すべての要素の値が偶数かどうか
Console.WriteLine("TrueForAll? {0}", Array.TrueForAll(arr, isEven))
End Sub
End Class
実行結果
Find: 4 FindIndex: 1 FindLast: 6 FindLastIndex: 5 FindAll: 4, 2, 6, Exists? True TrueForAll? False