yield return when appending values on to the end of an existing IEnumerable

c#, yield-return

Solution

Are you looking for this?

public override IEnumerable<ValidationResult> Validate(ValidationContext vc)
{
    // TryValidateObject fills the ICollection you pass it.
    List<ValidationResult> retVal = new List<ValidationResult>();
    Validator.TryValidateObject(this, vc, retVal, true);
    foreach (var item in retVal)
        yield return item;
    if (Name == "Arbitary")
        yield return new ValidationResult("Bad Name.", new[] { "Name" });
    else if (Email == "BadEmail")
        yield return new ValidationResult("Bad Email.", new[] { "Email" });       
}

If so, I believe the first version looks nicer.

Problem

I just found out about `yield return`, I seems really nice. I use it in a method like this: ``` public IEnumerable<ValidationResult> Validate(ValidationContext vc) { if (Name == "Arbitary") yield return new ValidationResult("Bad Name.", new[] { "Name" }); else if (Email == "BadEmail") yield return new ValidationResult("Bad Email.", new [] {"Email" }); // further rules follow. } ``` However, I need to change this method to return some ValidationResults from a child method. Without using `yield`, the code would look like this: ``` public override IEnumerable<ValidationResult> Validate(ValidationContext vc) { // TryValidateObject fills the ICollection you pass it. List<ValidationResult> retVal = new List<ValidationResult>(); Validator.TryValidateObject(this, vc, retVal, true); if (Name == "Arbitary") retVal.Add(new ValidationResult("Bad Name.", new[] { "Name" })); else if (Email == "BadEmail") retVal.Add(new ValidationResult("Bad Email.", new[] { "Email" })); return retVal; } ``` Is it possible to rewrite this using `yield`?

Original source