Ce n'est absolument pas une question stupide, et c'est quelque chose que F# prend en charge grâce à la fonction yield!
pour une collection complète vs yield
pour un seul élément. (Cela peut être très utile en termes de récursion de queue...)
Malheureusement, il n'est pas supporté en C#.
Toutefois, si vous avez plusieurs méthodes qui renvoient chacune un fichier IEnumerable<ErrorInfo>
vous pouvez utiliser Enumerable.Concat
pour rendre votre code plus simple :
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
return GetMoreErrors(card).Concat(GetOtherErrors())
.Concat(GetValidationErrors())
.Concat(AnyMoreErrors())
.Concat(ICantBelieveHowManyErrorsYouHave());
}
Il y a cependant une différence très importante entre les deux implémentations : celle-ci appelle toutes les méthodes immédiatement même si elle n'utilise les itérateurs retournés qu'un par un. Votre code existant attendra jusqu'à ce qu'il ait parcouru en boucle tout ce qui se trouve dans le fichier GetMoreErrors()
avant même qu'il ne soit demande sur les prochaines erreurs.
En général, ce n'est pas important, mais il est bon de comprendre ce qui va se passer quand.
0 votes
Je suis heureux (et curieux !) de voir que d'autres questions sur le rendement sont soulevées - je ne comprends pas très bien moi-même. Ce n'est pas une question stupide !
0 votes
Qu'est-ce que
GetCardProductionValidationErrorsFor
?4 votes
Quel est le problème avec retourner GetMoreErrors(carte) ; ?
10 votes
@Sam : "d'autres retours de rendement pour plus d'erreurs de validation"
1 votes
Du point de vue d'un langage non ambigu, un problème est que la méthode ne peut pas savoir s'il existe quelque chose qui implémente à la fois T et IEnumerable<T>. Vous avez donc besoin d'une construction différente dans le yield. Cela dit, ce serait bien d'avoir un moyen de le faire. Yield return yield foo, peut-être, où foo implémente IEnumerable<T> ?
2 votes
Pour ceux qui sont intéressés, la demande de fonctionnalité du langage C# à ce sujet se trouve ici : github.com/dotnet/csharplang/issues/378 je crois.