c# - 遍历层次结构对象c#

标签 c# hierarchy traversal

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

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

非常感谢

最佳答案

以下是如何遍历复合对象的通用示例:

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); }
       );
    }
}

关于c# - 遍历层次结构对象c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6501096/

相关文章:

database - 具有 where 子句行为的分层查询 "START WITH"

jquery - 在动态创建的元素上附加 javascript/jquery 事件

graph - Neo4j遍历时节点属性比较

c# - 反射以查找实现具有多个开放通用参数的接口(interface)的类

php - PHP 的对象浏览器

c# - 系统.IO.FileLoadException

Angular 2 - ng-bootstrap 如何为他们的 NgbRadio 指令提供 NgbRadioGroup 和 NgbButtonLabel?

php - PHP中遍历多维数组的递归方法

c# - 匿名类可以实现接口(interface)吗?

c# - Microsoft Bot Framework - Facebook 集成 - Net Framework