我希望获得树状结构中所有成员的列表(包含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 MemberBy 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.
更多推荐
发布评论