2009-05-18 32 views
73

我想知道是否有人可以解釋什麼是Func<int, string>以及如何使用它的一些明確的例子。Func的解釋

回答

123

你熟悉一般的代表?我有一個關於delegates and events的頁面,如果不是這樣,可能會有幫助,但它更適合於解釋兩者之間的差異。

Func<T, TResult>只是一個普通的委託 - 工作出它通過與聲明中的相應類型參數intstring)更換類型參數TTResult)在任何特定的情況意味着。我也給它改名,以避免混淆:

string ExpandedFunc(int x) 

換句話說,Func<int, string>是代表一個函數獲取int參數並返回一個string的委託。

Func<T, TResult>經常在LINQ中使用,既用於投影也用於謂詞(在後一種情況下,TResult始終爲bool)。例如,您可以使用Func<int, string>將一系列整數投影到一系列字符串中。 Lambda表達式通常在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 。 很明顯,如果你理解泛型類型和委託,但對於那些不需要它的人來說,函數kunc委託給一個接受int參數並返回一個字符串的函數是Func 。 – 2009-05-18 17:02:40

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

謝謝安德魯。你的意思是寫func(1)而不是bar(1)? – zSynopsis 2009-05-18 19:53:05

+1

是的,我做到了!感謝您的更正! – 2009-05-18 19:56:51

33

一個Func<int, string>吃整數並返回一個字符串。那麼,什麼吃ints並返回字符串?這個怎麼樣...

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

在那裏,我剛剛構造了一個函數,吃整數和返回字符串。我將如何使用它?

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(這些參考文獻中的方法被稱爲delegates)和使用該代替。 (記住fnc吃ints並返回字符串)。

這個例子不是非常性感,但你會看到很多聰明的東西是基於簡單的功能,代表和想法extension methods

這個東西我見過的最好的引物之一是here。他有更多真實的例子。 :)