我想知道是否有人可以解释一下Func<int, string>
是什么以及它如何与一些明显的例子一起使用。
答案 0 :(得分:138)
您是否熟悉一般的代表?我有一个关于delegates and events的页面,如果不是这样可能会有所帮助,尽管它更适合解释两者之间的差异。
Func<T, TResult>
只是一个通用委托 - 通过替换类型参数(T
和TResult
)来解决在任何特定情况下的含义声明中相应的类型参数(int
和string
)。我也将其重命名以避免混淆:
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
答案 1 :(得分:40)
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的引用(这些对方法的引用称为delegates),而是使用它。 (记住fnc吃掉int并返回字符串)。
这个例子不是很性感,但你会看到很多聪明的东西都是基于函数,代表和extension methods的简单概念。
我见过的最好的引物之一是here。他有更多真实的例子。 :)
答案 2 :(得分:25)
这是一个委托,它将一个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();
}
}
答案 3 :(得分:1)
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值参数,并返回浮点值。
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