I have the following function to get validation errors for a card. My question relates to dealing with GetErrors. Both methods have the same return type IEnumerable<ErrorInfo>.
private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
var errors = GetMoreErrors(card);
foreach (var e in errors)
yield return e;
// further yield returns for more validation errors
}
Is it possible to return all the errors in GetMoreErrors without having to enumerate through them?
It is something that F# supports with
yield!for a whole collection vsyieldfor a single item. (That can be very useful in terms of tail recursion…)Unfortunately it’s not supported in C#.
However, if you have several methods each returning an
IEnumerable<ErrorInfo>, you can useEnumerable.Concatto make your code simpler:There’s one very important difference between the two implementations though: this one will call all of the methods immediately, even though it will only use the returned iterators one at a time. Your existing code will wait until it’s looped through everything in
GetMoreErrors()before it even asks about the next errors.Usually this isn’t important, but it’s worth understanding what’s going to happen when.