次の方法で共有


配列とリストの操作に使用する汎用デリゲート

ここでは、配列またはコレクションの要素に対して実行される変換、検索述語、およびアクションの汎用デリゲートの概要について説明します。

配列とリストの操作に使用する汎用デリゲート

Action<T> 汎用デリゲートは、指定した型の要素に対して何らかのアクションを実行するメソッドを表します。 要素に対して必要なアクションを実行するメソッドを作成し、そのメソッドを表す Action<T> デリゲートのインスタンスを作成した後、配列とデリゲートを静的ジェネリック メソッド Array.ForEach に渡すことができます。 このメソッドは、配列の各要素に対して呼び出されます。

List<T> ジェネリック クラスにも、Action<T> デリゲートを使用する ForEach メソッドが用意されています。 このメソッドはジェネリックではありません。

注意

これは、ジェネリック型とジェネリック メソッドに関する興味深い点です。 Array はジェネリック型ではないため、Array.ForEach メソッドは static (Visual Basic では Shared) かつジェネリックであることが必要です。Array.ForEach に型を指定して動作させることができるのは、このメソッドが独自の型パラメーター リストを保持しているからです。 これに対して、非ジェネリック List<T>.ForEach メソッドは List<T> ジェネリック クラスに属しています。したがって、このメソッドは、このクラスの型パラメーターを使用しているにすぎません。 このクラスは厳密に型指定されているため、メソッドをインスタンス メソッドにすることができます。

Predicate<T> 汎用デリゲートは、特定の要素が定義されている基準を満たしているかどうかを判断するメソッドを表します。 Array の静的ジェネリック メソッドである ExistsFindFindAllFindIndexFindLastFindLastIndex、および TrueForAll でこのデリゲートを使用することにより、要素または要素のセットを検索できます。

Predicate<T> は、List<T> ジェネリック クラスの対応する非ジェネリック インスタンス メソッドも使用します。

Comparison<T> 汎用デリゲートを使用すると、ネイティブな並べ替え順序のない配列またはリストの要素の並べ替え順序を指定したり、ネイティブな並べ替え順序をオーバーライドしたりできます。 比較を実行するメソッドを作成し、そのメソッドを表す Comparison<T> デリゲートのインスタンスを作成した後、配列とデリゲートを Array.Sort<T>(T[], Comparison<T>) 静的ジェネリック メソッドに渡します。 List<T> ジェネリック クラスには、対応するインスタンス メソッド オーバーロードである List<T>.Sort(Comparison<T>) が用意されています。

Converter<TInput,TOutput> 汎用デリゲートを使用すると、2 つの型の間での変換を定義し、一方の型の配列をもう一方の型の配列に変換したり、一方の型のリストをもう一方の型のリストに変換したりできます。 既存のリストの要素を新しい型に変換するメソッドを作成し、そのメソッドを表すデリゲート インスタンスを作成したら、Array.ConvertAll 静的ジェネリック メソッドを使用して、元の配列から新しい型の配列を生成します。また、元のリストから新しい型のリストを生成する場合は、List<T>.ConvertAll<TOutput>(Converter<T,TOutput>) ジェネリック インスタンス メソッドを使用します。

デリゲートのチェーン

これらのデリゲートを使用するメソッドの多くは、別のメソッドに渡すことのできる配列またはリストを返します。 たとえば、配列の特定の要素を選択して新しい型に変換し、新しい配列に保存すると、FindAll ジェネリック メソッドによって返される配列を ConvertAll ジェネリック メソッドに渡すことができます。 新しい要素の型にネイティブな並べ替え順序がない場合は、ConvertAll ジェネリック メソッドによって返された配列を Sort<T>(T[], Comparison<T>) ジェネリック メソッドに渡すことができます。

参照