tresult parameter generic examples delegate c# func

parameter - generic delegates in c#



¿Alguien puede explicar qué hace C#"Func<T, T>"? (8)

Estoy leyendo el libro Pro MVC 2, y hay un ejemplo de cómo crear un método de extensión para la clase HtmlHelper.

Aquí el ejemplo del código:

public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int,string> pageUrl) { //Magic here. }

Y aquí hay un ejemplo de uso:

[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>") }

Editar: quitó parte que confundió el punto de esta pregunta.

La pregunta es: ¿Por qué el ejemplo usa Func? ¿Cuándo debería usarlo? ¿Qué es Func?

¡Gracias!


A Func<int, string> como

Func<int, String> pageUrl = i => "Page" + i;

es un delegado que acepta int como su único parámetro y devuelve una string . En este ejemplo, acepta un parámetro int con el nombre i y devuelve la cadena "Page" + i que simplemente concatena una representación de cadena estándar de i con la cadena "Page" .

En general, Func<TSource, TResult> acepta un parámetro que es de tipo TSource y devuelve un parámetro de tipo TResult . Por ejemplo,

Func<string, string> toUpper = s => s.ToUpper();

entonces puedes decir

string upper = toUpper("hello, world!");

o

Func<DateTime, int> month = d => d.Month;

para que puedas decir

int m = month(new DateTime(3, 15, 2011));


Crea tu propio

Func<int,string> myfunc;

a continuación, haga clic derecho en Func para ver la definición. Verás que es un delegado underneith

public delegate TResult Func<in T, out TResult>(T arg);


He implementado un método de extensión where () usando Func, eche un vistazo ...

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; } } }

Puedes usarlo como,

foreach ( var item in Emps.Where ( e => e.Name == "Shiv" ).Select ( e1 => e1.Name ) ) { Console.WriteLine ( item ); }


La línea Func<int, string> que está investigando se conoce como expresión lambda.

Func<int, String> pageUrl = i => "Page" + i;

Esta línea se puede describir como una función que toma un parámetro int ( i ) y devuelve una cadena "Page" + i ;

Se puede volver a escribir como:

delegate(int i) { return "Page" + i; }


Porque el método PageLinks es un método de extensión .

En el método de extensión, el primer parámetro comienza con esta palabra clave para indicar que se trata de un método de extensión en el tipo representado por el primer parámetro.

El Func<T1, T2> es un delegado que representa una transformación de tipo T1 a tipo T2 . Entonces, básicamente, su método PageLinks aplicará esa transformación a int para producir una string .


Tener una publicación de blog sobre esto. Usando Func puede resolver algunas de las discrepancias funcionales. Lea here .


Func<T, TResult> : encapsula un método que tiene un parámetro y devuelve un valor del tipo especificado por el parámetro TResult. Vea esta página para más detalles y ejemplos. :-)


Func<int, String> significa un método de devolución de llamada que toma un parámetro int y devuelve una String como resultado.

La siguiente expresión, que se conoce como expresión lambda :

Func<int, String> pageUrl = i => "Page" + i;

se expande a algo como esto:

Func<int, String> pageUrl = delegate(int i) { return "Page" + i; }