Vous pouvez casser votre méthode en deux. Compte tenu de ces méthodes d'extension:
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);
}
}
Et en utilisant de example Eric Lippert, il devient ceci:
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();
}
}
La méthode intérieure donne enumerables de T au lieu de T, et la méthode externe a juste besoin d'aplatir ce résultat .
cela a été demandé plusieurs fois et devrait être fusionné. chercher "yield multiple enumerable" – mafu
@mafutrct: * Aucun résultat trouvé pour "yield multiple enumerable". * Pouvez-vous donner un exemple? –
C'est ce que j'ai trouvé (accordé, avec une phrase de recherche différente): 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. Cependant, je n'ai pas trouvé la question que je cherchais qui expliquait exactement ce qui était demandé. Je me souviens aussi d'avoir moi-même posé cette question il y a quelque temps ... Je vais essayer de le retrouver dans ma liste de questions. – mafu