通过使用yield return递归获取Tree

编程入门 行业动态 更新时间:2024-10-07 19:28:35
通过使用yield return递归获取Tree-Structure的子项(Get children of a Tree-Structure recursively by using yield return)

我希望获得树状结构中所有成员的列表(包含n个包含n个组的组的组等等。根元素也包含成员。

架构:

Group Group Member Member Member Group Member Group Member Member Group Group Group Member

到现在为止,我的代码如下所示:

public IEnumerable<Member> GetMembers() { foreach(var member in this.MemberCollection) { yield return member; } foreach(var group in this.GroupCollection) { GetMembers(); } }

不幸的是,这不起作用 - “GetMembers()”调用只是“被忽略” - 是否有“解决方法”?

我已经找到了与此类似的解决方案:

public IEnumerable<Member> GetMembers() { foreach(var group in this.GroupCollection) { foreach(var member in GetMembers()) { yield return member; } } }

I want to get a List of all Members in a Tree-like Structure (a Group which contains n groups which contain n groups and so on. The root Element also contains Members.

Schema:

Group Group Member Member Member Group Member Group Member Member Group Group Group Member

By now my code looks like this:

public IEnumerable<Member> GetMembers() { foreach(var member in this.MemberCollection) { yield return member; } foreach(var group in this.GroupCollection) { GetMembers(); } }

Unfortunately this does not work - the "GetMembers()" call just gets "ignored" - is there a "Workaround"?

I already found solutions similar to this one:

public IEnumerable<Member> GetMembers() { foreach(var group in this.GroupCollection) { foreach(var member in GetMembers()) { yield return member; } } }

最满意答案

要递归,您的方法应该采用一个参数(否则递归永远不会停止):

public IEnumerable<Member> GetMembers(Group group) { foreach(var member in group.MemberCollection) { yield return member; } foreach(var subGroup in group.GroupCollection) { foreach (var member in GetMembers(group)) { yield return member; } } }

但是,对于深层嵌套的层次结构,递归迭代器块往往效率很低。 更好的方法是使用迭代而不是递归。 要像递归方法那样获得深度优先遍历,您可以这样做:

public IEnumerable<Member> GetMembers() { var stack = new Stack<Group>(); stack.Push(this); while (stack.Count > 0) { var group = stack.Pop(); foreach(var member in group.MemberCollection) { yield return member; } foreach(var subGroup in group.GroupCollection) { stack.Push(subGroup); } } }

要获得广度优先遍历,请使用队列而不是堆栈。

To be recursive, your method should take a parameter (otherwise the recursion will never stop):

public IEnumerable<Member> GetMembers(Group group) { foreach(var member in group.MemberCollection) { yield return member; } foreach(var subGroup in group.GroupCollection) { foreach (var member in GetMembers(group)) { yield return member; } } }

However, recursive iterator blocks tend to be quite inefficient for deeply nested hierarchies. A better approach is to do use iteration rather than recursion. To get a depth-first traversal as in the recursive approach, you can do this:

public IEnumerable<Member> GetMembers() { var stack = new Stack<Group>(); stack.Push(this); while (stack.Count > 0) { var group = stack.Pop(); foreach(var member in group.MemberCollection) { yield return member; } foreach(var subGroup in group.GroupCollection) { stack.Push(subGroup); } } }

To get a breadth-first traversal, use a queue instead of a stack.

更多推荐

本文发布于:2023-07-09 10:30:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1085638.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:递归   yield   return   Tree

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!