2009-05-18 40 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。他有更多真实的例子。 :)