【问题标题】:Traverse hierarchy object c#遍历层次结构对象c#
【发布时间】:2011-09-23 23:19:57
【问题描述】:

如果我有一个像下面这样的课程。我如何遍历它直到它的属性 SomeObjects.count = 0

public class SomeObject
{
  public String Name { get; set; }
  public List<SomeObject> SomeObjects { get; set; }
}

非常感谢

【问题讨论】:

  • SomeObjects = 0SomeObjects List&lt;&gt; 是什么意思?有几个选项可以遍历 List。请澄清您的问题。
  • 这里有点模糊的问题,它真的很清楚你遇到了什么麻烦。您是在问如何编写递归函数吗?还是需要按特定顺序遍历对象?到目前为止,您尝试过什么?
  • 我的意思是 List 我的意思是 Tree

标签: c# hierarchy traversal


【解决方案1】:

这是一个如何遍历复合对象的通用示例:

public static class TraversalHelper{

    public static void TraverseAndExecute<T>(this T composite, Func<T,IEnumerable<T>> selectChildren, Action<T> action)
        where T: class
    {
         action.Invoke(composite);
         composite.TraverseAndExecute(selectChildren, action, new List<T>{ composite });
    }

    private static void TraverseAndExecute<T>(this T composite, Func<T,IEnumerable<T>> selectChildren, Action<T> action, IList<T> invokedComponents)
        where T: class
    {
        invokedComponents = invokedComponents ?? new List<T>();
        var components = selectChildren(composite) ?? new T[]{};
        foreach(var component in components){
            // To avoid an infinite loop in the case of circular references, ensure 
            // that you don't loop over an object that has already been traversed
            if(!invokedComponents.Contains(component)){
                action.Invoke(component);
                invokedComponents.Add(component);
                component.TraverseAndExecute<T>(selectChildren, action, invokedComponents);
            }
            else{
                // the code to execute in the event of a circular reference
                // would go here
            }
        }
    }
}

这是一个示例用法:

public class Program{
    public static void Main(){
   var someObject = new SomeObject { 
                        Name = "Composite",
                        SomeObjects = new List<SomeObject>{
                            new SomeObject{ Name = "Leaf 1" },
                            new SomeObject{ 
                                Name = "Nested Composite",
                                SomeObjects = new List<SomeObject>{ new SomeObject{Name = "Deep Leaf" }}
                            }
                        }
                    };
   someObject.TraverseAndExecute(      
                      x => x.SomeObjects, 
                      x => { Console.WriteLine("Name: " + x.Name); }
       );
    }
}

【讨论】:

  • 谢谢,这就是我要找的。​​span>
  • @niju,很高兴我能帮上忙。您可以通过单击目标答案帖子左上角的复选标记来选择答案。
  • 这是否也会遍历可枚举的成员?
  • @LuisFerrao,selectChildren 参数是选择可枚举的委托。 foreach 子句遍历生成的枚举中的每个元素。
【解决方案2】:

这是一个树状结构;遍历它的算法有很多,你可以search for tree-traversal algorithms,你会找到很多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多