有人可以解释一下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的委托。 在这个例子中,它接受一个名称为iint参数,并返回string"Page" + i ,它将"Page" + i的标准string表示连接到string"Page"

通常, Func<TSource, TResult>接受一个TSourcetypes的参数,并返回TResulttypes的参数。 例如,

 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>是一个代表从T1types到T2types转换的委托。 所以基本上,你的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);