1
votes

Existe-t-il un moyen de répéter une Func avec la méthode Enumerable.Repeat en C #?

J'ai écrit une fonction qui accepte (Func & int N) et répète le Func N fois et renvoie un résultat.

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{
    yield return Enumerable.Repeat<T>(function.Invoke(), iteration);
}

Est-il possible de répéter une fonction en utilisant Enumerable.Repeat?

public IEnumerable<T> MyFunction(Func<T, T> function, int iteration)
{

}

J'ai essayé d'exécuter le code ci-dessus, mais la fonction s'exécute une fois.


8 commentaires

En un mot, non. Répéter n'est pas destiné à répéter un appel de fonction; il est destiné à répéter une valeur. Utilisez simplement une boucle comme n'importe quel programmeur sensé;).


Nous pouvons également répéter une Action . Action est-il une valeur? @HereticMonkey


Pouvez-vous me montrer de la documentation indiquant que Enumerable.Repeat peut exécuter une Action plusieurs fois? La seule documentation que je puisse trouver indique qu'elle renvoie un énumérable d'une sorte de valeur un nombre spécifié de fois


Utilisez ceci: Enumerable.Repeat (() => {Console.WriteLine ("Hello World");}, 10) .ToList (). ForEach (f => f.Invoke ()); < / code> @HereticMonkey


Cela n'exécute pas l'action; qui définissent 10 actions prêtes à être appelées (et sont, plus tard , dans votre ForEach ) (et vous ne devriez pas avoir besoin de la ToList là-dedans non plus)


Alors, y a-t-il un moyen de répéter une fonction comme ça? @HereticMonkey


Modifiez votre question avec une manière réaliste de l'utiliser. À l'heure actuelle, cela n'a pas l'air très pratique; une boucle ferait la même chose avec moins de code, ce qui est plus significatif pour les lecteurs ultérieurs.


Vous pouvez construire quelque chose de bizarre qui répète une fonction en utilisant Répéter , donc techniquement la réponse est oui. Répéter répète n'importe quoi. Mais ce serait étrangement alambiqué. Le prochain développeur serait confus, peut-être le réécrire en utilisant une boucle, puis s'inquiéterait qu'il se passe quelque chose de plus compliqué et qu'il l'ait raté. Puis, quand ils se rendront compte qu'ils n'ont rien manqué, ils auront ce sentiment de naufrage et penseront: "Oh, non, qu'est-ce que je vais trouver d'autre ici?"


3 Réponses :


1
votes

Pourquoi ne pas simplement appeler la méthode dans une boucle:

return Enumerable.Range(0, iteration).Select(x => function(MyTInstance));

ou dans une instruction Linq:

for(int i = 0; i < iteration; i++)
    yield return function(myTInstance);


3 commentaires

Merci, @HimBromBeere! Mais je recherche une manière élégante de répéter une fonction.


@SalehBagheri Je n'obtiens pas ce que tu veux. Ce code fait exactement ce que vous voulez: exécuter une méthode plusieurs fois et regrouper toutes les méthodes return-values ​​dans une collection.


@HimBromBeere Je pense qu'il devrait apprendre ce qu'est un clou, ce qu'est un outil, quel est le type de retour, puis commencer à utiliser des marteaux LINQ. Sinon, il finira avec un désordre dans son esprit et deviendra "programmeur copier-coller";)



1
votes
public Func<T,T> MyFunction(Func<T, T> function, int iteration)
{
    // create a collection with `N = interation` items
    IEnumerable<Func<T,T>> items = Enumerable.Repeat<T>(function.Invoke(), iteration);

    // return items
    foreach(Func<T,T> item in items)
    {
        yield return item;
    }
}

0 commentaires

1
votes

Il existe un moyen, même si je ne suis pas sûr de ce que cela prouve.

0
1
2
3
4
5
6
7
8
9

Pour une raison quelconque, bien qu'il soit plus courant de voir les gens faire de cette façon:

XXX

Je vois la dernière construction sur Stackoverflow tout le temps.

Sortie:

    return Enumerable.Range(0, iteration).Select( x => function() );


3 commentaires

@ John-wu Vous utilisez une expression LINQ et lambda pour répondre à une question posée par quelqu'un qui ne comprend pas les énumérateurs et ne donne pas de mot-clé. La réponse sans LINQ et lambda serait plus facile à comprendre pour les novices.


@Kamil, je n'ai posé qu'une question sur la répétition d'une fonction sans utiliser For ou ForEach ou d'autres mots-clés en boucle. Avez-vous une idée à ce sujet? Sinon, ne jugez pas mes connaissances!


@Kamil Je pense que cette réponse est utile car elle démontre un correct, idiomatique, et ce qui est probablement la seule utilisation de Enumerable.Repeat () , qui consiste à le combiner avec LINQ pour générer des séquences utiles. Honnêtement, je ne sais pas à quoi je l'utiliserais d'autre.