2009-05-18 18 views
73

私は誰かが何を説明できるかどうか、そしてそれがいくつかの明確な例とともにどのように使用されているのかを説明できるかどうか疑問に思っていました。Funcの説明

答えて

123

あなたは一般的には、デリゲートに精通していますか?私はdelegates and eventsについてのページを持っていますが、そうでないと助けになるかもしれませんが、2つの違いを説明するのに役立ちます。

Func<T, TResult>はちょうどジェネリックデリゲートである - それは、宣言に対応する型引数intstring)で型パラメータTTResult)を置き換えることにより、任意の特定の状況で何を意味するのかうまく。 Func<int, string>が機能int引数を取り、stringを返すを表しデリゲートである、言い換えれば

string ExpandedFunc(int x) 

:私はまた、混乱を避けるために、それを名前を変更しました。

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 
+2

"つまり、int型の引数をとり、文字列を返す関数を表すデリゲートです。" 他人の混乱を避けるために、Func ではなく、Func についてここで話していることを明確にします。 ジェネリック型とデリゲートを理解しているのは明らかですが、それがない人は、Func がint引数をとり、文字列を返す関数に委任しています。 –

+0

私は後でPCに戻ったときに明確になります。 –

+8

Downvoters:理由を説明してください... –

22

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(); 
    } 
} 
+0

ありがとうございます。 bar(1)の代わりにfunc(1)を書くことを意味しましたか? – zSynopsis

+1

はい私はしました!訂正ありがとう! –

33

Func<int, string>はint型を食べると文字列を返します。だから、intを食べて文字列を返すのは何ですか?どうですか...

public string IntAsString(int i) 
{ 
    return i.ToString(); 
} 

ここで、intsを取得して文字列を返す関数を作成しました。どうすれば使えますか?

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を使ってみましょう。代わりに、各部材にIntAsStringを呼び出す

Func<int, string> fnc = IntAsString; 

foreach (int i in lst) 
{ 
    str += fnc(i); 
} 

// str will be "1234512345" assuming we have same str as before 

、Iは、(メソッドへのこれらの参照はdelegates呼ばれる)FNCと呼ばれるそれへの参照を作成し、代わりにそれを使用します。 (fncはintsを取り、文字列を返します)。

この例は、あまりセクシーではありませんが、あなたが見ることになる巧妙なものの大部分は、関数、代理人、およびextension methodsという単純な考え方に基づいています。

私が見たこの材料の中で最高のプライマーの1つはhereです。彼はもっと多くの本物の例を持っている。 :)

+4

私はこの説明が好きです –

+0

@Therealnapster私はそれも好きですが、私はあなたのより多くの名前が好きです。 – BKSpurgeon