誰かがFunc<int, string>
は、いくつかの明確な例で使用される方法です。
デリゲート全般に精通していますか? デリゲートとイベント についてのページがあります。これはそうでない場合に役立ちますが、2つの違いを説明することを目的としています。
Func<T, TResult>
は単なる一般的なデリゲートです。特定の状況でtypeパラメーターを置き換えることで意味を理解します(T
およびTResult
)に対応するtype引数(int
およびstring
)を宣言に含めます。また、混乱を避けるために名前を変更しました。
string ExpandedFunc(int x)
言い換えると、 Func<int, string>
は、int
引数を取り、string
を返す関数を表すデリゲートです。
Func<T, TResult>
は、投影と述語の両方でLINQでよく使用されます(後者の場合、TResult
は常にbool
です)。たとえば、Func<int, string>
一連の整数を一連の文字列に射影します。 ラムダ式は通常、関連するデリゲートを作成するためにLINQで使用されます:
Func<int, string> projection = x => "Value=" + x;
int[] values = { 3, 7, 10 };
var strings = values.Select(projection);
foreach (string s in strings)
{
Console.WriteLine(s);
}
結果:
Value=3
Value=7
Value=10
Func<int, string>
は整数を食べ、文字列を返します。それでは、intを食べて文字列を返すものは何でしょうか?これはどう ...
public string IntAsString( int i )
{
return i.ToString();
}
そこで、intを食べて文字列を返す関数を作成しました。どのように使用しますか?
var lst = new List<int>() { 1, 2, 3, 4, 5 };
string str = String.Empty;
foreach( int i in lst )
{
str += IntAsString(i);
}
// str will be "12345"
それほどセクシーではありませんが、それは多くのトリックが基づいている単純なアイデアです。では、代わりにFuncを使用しましょう。
Func<int, string> fnc = IntAsString;
foreach (int i in lst)
{
str += fnc(i);
}
// str will be "1234512345" assuming we have same str as before
各メンバーでIntAsStringを呼び出す代わりに、fncというメソッドへの参照を作成し(メソッドへのこれらの参照は デリゲート と呼ばれます)、代わりにそれを使用しました。 (fncはintを食べ、文字列を返すことを忘れないでください)。
この例はそれほどセクシーではありませんが、表示される巧妙なものの多くは、関数、デリゲート、および 拡張メソッド の単純なアイデアに基づいています。
私がこれまでに見てきた中で最高の入門書の1つは、 ここ です。彼にはもっと多くの実例があります。 :)
これは、パラメーターとして1つのint
を取り、タイプstring
の値を返すデリゲートです。
その使用例を次に示します。
using System;
class Program
{
static void Main()
{
Func<Int32, String> func = bar;
// now I have a delegate which
// I can invoke or pass to other
// methods.
func(1);
}
static String bar(Int32 value)
{
return value.ToString();
}
}
Func<int, string>
はint値パラメーターを受け入れ、ストリング値を返します。追加のサポート方法が不要な例を次に示します。
Func<int, string> GetDogMessage = dogAge =>
{
if (dogAge < 3) return "You have a puppy!";
if (dogAge < 7) return "Strong adult dog!";
return "Age is catching up with the dog!";
};
string youngDogMessage = GetDogMessage(2);
注:Funcの最後のオブジェクトタイプ(この例では「文字列」)は、関数の戻り値のタイプ(つまり、プリミティブに限定されず、任意のオブジェクト)です。したがって、Func<int, bool, float>
は、intおよびbool値のパラメーターを受け入れ、float値を返します。
Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
{
if(intValue > 100 && boolValue) return 100;
return 1;
};
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);
HTH