情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Func<T1, T2, T3, TResult> デリゲート

2013/12/12

3 つのパラメーターを受け取って TResult パラメーターに指定された型の値を返すメソッドをカプセル化します。

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public delegate TResult Func<in T1, in T2, in T3, out TResult>(
	T1 arg1,
	T2 arg2,
	T3 arg3
)

型パラメーター

in T1

このデリゲートによってカプセル化されるメソッドの第 1 パラメーターの型。

このパラメーターが反変の型パラメーターです。つまり、指定した型またはより弱い任意の派生型を使用できます。 共変性と反変性の詳細については、「[2678dc63-c7f9-4590-9ddc-0a4df684d42e]」を参照してください。

in T2

このデリゲートによってカプセル化されるメソッドの第 2 パラメーターの型。

in T3

このデリゲートによってカプセル化されるメソッドの第 3 パラメーターの型。

out TResult

このデリゲートによってカプセル化されるメソッドの戻り値の型。

このパラメーターが共変の型パラメーターです。つまり、指定した型またはより強い任意の派生型を使用できます。 共変性と反変性の詳細については、「[2678dc63-c7f9-4590-9ddc-0a4df684d42e]」を参照してください。

パラメーター

arg1
型: T1
このデリゲートによってカプセル化されるメソッドの第 1 パラメーター。
arg2
型: T2
このデリゲートによってカプセル化されるメソッドの第 2 パラメーター。
arg3
型: T3
このデリゲートによってカプセル化されるメソッドの第 3 パラメーター。

戻り値

型: TResult
このデリゲートによってカプセル化されるメソッドの戻り値。

このデリゲートを使用すると、カスタム デリゲートを明示的に宣言しなくてもパラメーターとして渡すことのできるメソッドを表すことができます。作成するメソッドは、このデリゲートによって定義されたメソッドのシグネチャと一致していることが必要です。つまり、カプセル化されるメソッドは、値渡しされる 3 つのパラメーターを受け取って、値を返す必要があります。

メモメモ:

3 個のパラメーターを受け取り void を返すメソッド (Visual Basic では、Function ではなく、Sub として宣言されるメソッド) を参照するには、汎用 Action<T1, T2, T3> デリゲートを使用してください。

Func<T1, T2, T3, TResult> デリゲートを使用する場合、3 つのパラメーターを持つメソッドについては、それをカプセル化するデリゲートを明示的に定義する必要はありません。たとえば、次のコードでは、ParseNumber という汎用デリゲートを明示的に宣言し、Parse メソッドへの参照をそのデリゲート インスタンスに割り当てています。


using System;
using System.Globalization;

delegate T ParseNumber<T>(string input, NumberStyles styles,
                         IFormatProvider provider);

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      string numericString = "-1,234";
      ParseNumber<int> parser = int.Parse;
      outputBlock.Text += parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture) + "\n";
   }
}


このコードは、新しいデリゲートを明示的に宣言し、そこに指定のメソッドを割り当てるよりも、次の例のように Func<T1, T2, T3, TResult> デリゲートをインスタンス化することによって、簡潔に記述できます。


using System;
using System.Globalization;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      string numericString = "-1,234";
      Func<string, NumberStyles, IFormatProvider, int> parser = int.Parse;
      outputBlock.Text += parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture) + "\n";
   }
}


次の例に示すように、Func<T1, T2, T3, TResult> デリゲートは C# の匿名メソッドと組み合わせて使用できます。


using System;
using System.Globalization;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      string numericString = "-1,234";
      Func<string, NumberStyles, IFormatProvider, int> parser =
           delegate(string s, NumberStyles sty, IFormatProvider p)
           { return int.Parse(s, sty, p); };
      outputBlock.Text += parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture) + "\n";
   }
}


次の例に示すように、Func<T1, T2, T3, TResult> デリゲートにはラムダ式を割り当てることもできます。


using System;
using System.Globalization;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      string numericString = "-1,234";
      Func<string, NumberStyles, IFormatProvider, int> parser = (s, sty, p)
                   => int.Parse(s, sty, p);
      outputBlock.Text += parser(numericString,
                        NumberStyles.Integer | NumberStyles.AllowThousands,
                        CultureInfo.InvariantCulture) + "\n";
   }
}


ラムダ式の基になる型は、汎用 Func デリゲートのいずれかに該当します。これにより、デリゲートに対して明示的に割り当てることなく、ラムダ式をパラメーターとして渡すことが可能となります。特に、System.Linq 名前空間に存在する型の多くのメソッドには、Func パラメーターが存在するため、Func デリゲートを明示的にインスタンス化することなく、これらのメソッドにラムダ式を渡すことができます。

Func<T1, T2, TResult> デリゲートを宣言して使用する方法を次の例に示します。この例では、Func<T1, T2, TResult> 変数を宣言し、そこに、String 値と Int32 値をパラメーターとして受け取るラムダ式を割り当てています。このラムダ式は、String パラメーターの長さが Int32 パラメーターの値と等しい場合に true を返します。このメソッドをカプセル化するデリゲートは、その後、文字列配列内から特定の文字列をフィルター選択するクエリの中で使用されています。


using System;
using System.Collections.Generic;
using System.Linq;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      Func<String, int, bool> predicate = (str, index) => str.Length == index;

      String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
      IEnumerable<String> aWords = words.Where(predicate).Select(str => str);

      foreach (String word in aWords)
         outputBlock.Text += word + "\n";
   }
}


Windows Phone OS

サポート: 8.0, 7.1, 7.0

リファレンス

表示: