任务本质:绕过树(preorder),但是不能返回正常的IEnumerable<VisualElement>,只返回第一个元素,循环到此结束。该算法是正确的,因为如果将方法设为 void 而不是yield return rootdone Console.WriteLine(root),那么所有内容都会以正确的顺序显示。
public static IEnumerable<VisualElement> GetChildren(VisualElement root)
{
yield return root;
if (root?.Children != null)
foreach (var child in root.Children)
{
GetChildren(child);
}
}
当然,您可以添加一个字段List<VisualElement>,然后yield return将其添加到集合中,但是这种方法对我来说似乎很糟糕,因为当您再次运行该方法时,它将List是非空的。
递归
也就是说,还需要使用枚举器从子调用中提取值
只需要注意这个递归是尾的,可以优化为一个循环,完全摆脱递归。