Usted puede romper su método en dos. Dados estos métodos de extensión:
public static class MultiEnumerableExtensions {
public static IEnumerable<T> Pack<T>(this T item) {
yield return item;
}
public static IEnumerable<T> Flatten<T>(
this IEnumerable<IEnumerable<T>> multiList) {
return multiList.SelectMany(x => x);
}
}
Y utilizando de example Eric Lippert, se convierte en esto:
public static class BinaryTreeExtensions {
public static IEnumerable<T> PreorderTraversal<T>(this BinaryTree<T> root) {
return PreorderTraversalMulti(root).Flatten();
}
private static IEnumerable<IEnumerable<T>> PreorderTraversalMulti<T>(
this BinaryTree<T> root) {
if (root == null) yield break;
yield return root.Item.Pack(); // this packs an item into an enumerable
yield return root.Left.PreorderTraversal();
yield return root.Right.PreorderTraversal();
}
}
El método interno produce enumerables de T en lugar de Ts, y el método exterior sólo necesita para aplanar este resultado .
esto se ha preguntado muchas veces y debería combinarse. buscar "rendimiento múltiple enumerable" – mafu
@mafutrct: * No se encontraron resultados para "rendimiento enumerable múltiple". * ¿Puedes dar un ejemplo? –
Esto es lo que encontré (concedido, con una frase de búsqueda diferente): http://stackoverflow.com/questions/2055927/ienumerable-and-recursion-using-yield-return, http://stackoverflow.com/questions/ 1824934/rewrite-this-foreach-yield-to-a-linq-yield, http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable. Sin embargo, no encontré la pregunta que estaba buscando que explicara exactamente lo que se solicitaba. También recuerdo haberme preguntado esto hace un tiempo ... Trataré de buscarlo en mi lista Q. – mafu