有人可以解释一下C#“Func <T,T>”的function吗?
我正在阅读Pro MVC 2书籍,并且有一个为HtmlHelper类创build扩展方法的例子。
这里的代码示例:
public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int,string> pageUrl) { //Magic here. }
这里是一个示例用法:
[Test] public void Can_Generate_Links_To_Other_Pages() { //Arrange: We're going to extend the Html helper class. //It doesn't matter if the variable we use is null HtmlHelper html = null; PagingInfo pagingInfo = PagingInfo(){ CurrentPage = 2, TotalItems = 28, ItemsPerPage = 10 }; Func<int, String> pageUrl = i => "Page" + i; //Act: Here's how it should format the links. MvcHtmlString result = html.PageLinks(pagingInfo, pageUrl); //Assert: result.ToString().ShouldEqual(@"<a href=""Page1"">1</a><a href=""Page2"">2</a><a href=""Page3"">3</a>") }
编辑:删除了混淆这个问题的一部分。
问题是:为什么使用Func的例子? 我应该什么时候使用它? 什么是Func?
谢谢!
一个Func<int, string>
like
Func<int, String> pageUrl = i => "Page" + i;
是一个接受int
作为唯一参数并返回一个string
的委托。 在这个例子中,它接受一个名称为i
的int
参数,并返回string"Page" + i
,它将"Page" + i
的标准string表示连接到string"Page"
。
通常, Func<TSource, TResult>
接受一个TSource
types的参数,并返回TResult
types的参数。 例如,
Func<string, string> toUpper = s => s.ToUpper();
那么你可以说
string upper = toUpper("hello, world!");
要么
Func<DateTime, int> month = d => d.Month;
所以你可以说
int m = month(new DateTime(3, 15, 2011));
Func<int, String>
表示一个callback方法,它接受一个int
参数并返回一个String
作为结果。
下面的expression式被称为lambdaexpression式 :
Func<int, String> pageUrl = i => "Page" + i;
扩展到这样的东西:
Func<int, String> pageUrl = delegate(int i) { return "Page" + i; }
您正在查询的Func<int, string>
行被称为lambdaexpression式。
Func<int, String> pageUrl = i => "Page" + i;
这行可以被描述为一个函数,它接受一个int参数( i
)并返回一个string"Page" + i
;
它可以被重写为:
delegate(int i) { return "Page" + i; }
因为PageLinks
方法是一个扩展方法 。
在扩展方法中,第一个参数从这个关键字开始,表示它是由第一个参数表示的types的扩展方法。
Func<T1, T2>
是一个代表从T1
types到T2
types转换的委托。 所以基本上,你的PageLinks
方法将把这个转换应用到int
来产生一个string
。
Func<T, TResult>
:封装一个具有一个参数的方法,并返回由TResult参数指定的types的值。 看到这个页面的更多细节和例子。 🙂
有这个博客文章。 使用Func
可以解决一些function差异。 在这里阅读。
我已经实现了使用Func的where()扩展方法,请看看…
public static IEnumerable<Tsource> Where<Tsource> ( this IEnumerable<Tsource> a , Func<Tsource , bool> Method ) { foreach ( var data in a ) { //If the lambda Expression(delegate) returns "true" Then return the Data. (use 'yield' for deferred return) if ( Method.Invoke ( data ) ) { yield return data; } } }
你可以使用它,
foreach ( var item in Emps.Where ( e => e.Name == "Shiv" ).Select ( e1 => e1.Name ) ) { Console.WriteLine ( item ); }
创build你自己的
Func<int,string> myfunc;
然后右键单击Func查看定义。 你会看到它是一个代表underneith
public delegate TResult Func<in T, out TResult>(T arg);