remarks cref c# .net yield

cref - remarks c#



C#: rango de rendimiento de rendimiento/colección (3)

Uso bastante la palabra clave yield return , pero me parece que falta cuando quiero agregar un rango al IEnumerable . Aquí hay un ejemplo rápido de lo que me gustaría hacer:

IEnumerable<string> SomeRecursiveMethod() { // some code // ... yield return SomeRecursiveMethod(); }

Naturalmente, esto da como resultado un error, que se puede resolver haciendo un ciclo simple. ¿Hay una mejor manera de hacer esto? Un bucle se siente un poco torpe.


La palabra clave yield es realmente muy agradable. Pero anidarlo en un bucle for hará que se genere y ejecute más código de pegamento.

Si puede vivir con un estilo de programación menos funcional, puede pasar una Lista a la que lo anexe:

void GenerateList(List<string> result) { result.Add("something") // more code. GenerateList(result); }


No, no hay miedo. ¡F # lo admite con yield! , pero no hay equivalente en C # - básicamente tienes que usar el bucle. Lo siento ... siento tu dolor. Lo mencioné en una de mis publicaciones en el blog Edulinq , donde habría hecho las cosas más simples.

Tenga en cuenta que usar el retorno de rendimiento de forma recursiva puede ser costoso; consulte la publicación de Wes Dyer sobre iteradores para obtener más información (y mencione un "rendimiento foreach" que se estaba considerando hace cuatro años ...)


Si ya tiene un IEnumerable para IEnumerable , y el tipo de devolución es IEnumerable (como es el caso de las funciones que podrían usar el yield return ), puede simplemente devolver esa enumeración.

Si tiene casos en los que necesita combinar resultados de múltiples IEnumerable , puede usar el método de extensión IEnumerable<T>.Concat .

En su ejemplo recursivo, sin embargo, debe finalizar la enumeración / concatenación en función del contenido de la enumeración. No creo que mi método sea compatible con esto.