web-dev-qa-db-fra.com

Quelqu'un peut-il expliquer ce que fait le C # "Func <T, T>"?

Je lis le livre Pro MVC 2, et voici un exemple de création d'une méthode d'extension pour la classe HtmlHelper.

Voici l'exemple de code:

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

Et voici un exemple d'utilisation:

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

}

Edit: Partie supprimée qui a confondu le point de cette question.

La question est: pourquoi l'exemple utilise-t-il Func? Quand devrais-je l'utiliser? Qu'est ce que Func?

Merci!

39
delete

Un Func<int, string> comme 

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

est un délégué qui accepte int comme seul paramètre et renvoie une string. Dans cet exemple, il accepte un paramètre int nommé i et renvoie la chaîne "Page" + i qui concatène simplement une représentation sous forme de chaîne standard de i avec la chaîne "Page".

En général, Func<TSource, TResult> accepte un paramètre de type TSource et renvoie un paramètre de type TResult. Par exemple,

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

alors vous pouvez dire

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

ou

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

alors tu peux dire

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

Func<int, String> signifie une méthode de rappel qui prend un paramètre int et retourne une String comme résultat.

L'expression suivante, connue sous le nom de expression lambda :

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

se développe à quelque chose comme ceci:

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

La ligne Func<int, string> à laquelle vous vous adressez est appelée expression lambda.

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

Cette ligne peut être décrite comme une fonction qui prend un paramètre int (i) et retourne une chaîne "Page" + i;

Il peut être réécrit comme:

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

Avoir un blog sur ce sujet. En utilisant Func, vous pouvez résoudre certaines divergences fonctionnelles. Lire ici .

1
nznoor

Parce que la méthode PageLinks est une Méthode d'extension .

Dans la méthode d'extension, le premier paramètre commence par ce mot-clé pour indiquer qu'il s'agit d'une méthode d'extension du type représenté par le premier paramètre.

Le Func<T1, T2> est un délégué qui représente une transformation du type T1 au type T2. Donc, fondamentalement, votre méthode PageLinks appliquera cette transformation à int pour produire un string.

1
Unmesh Kondolikar

Func<T, TResult>: encapsule une méthode qui a un paramètre et renvoie une valeur du type spécifié par le paramètre TResult. Voir cette page pour plus de détails et des exemples. :-)

1
Ke Sun

Crée le tien 

Func<int,string> myfunc; 

puis cliquez avec le bouton droit sur Func pour afficher la définition. Vous verrez que c'est un délégué sous-jacent

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

J'ai implémenté une méthode d'extension where () en utilisant Func, jetez un oeil ...

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

Vous pouvez l'utiliser comme, 

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