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.
3 Réponses :
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);
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";)
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; } }
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() );
@ 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.
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? @HereticMonkeyPouvez-vous me montrer de la documentation indiquant que
Enumerable.Repeat
peut exécuter uneAction
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 foisUtilisez 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 laToList
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?"