如何处理Parent / Child / GrandChild关系?

时间:2014-07-01 12:41:46

标签: c# enumerable

我正在寻找一种表示具有Parent,Child和孙子对象的对象的方法。我不想用:

 IEnumerable<IEnumerable<IEnumerable<Node>>>

如果可能的话。

每个节点都是相同的:

public class Node
{
    public string Text { get; set; }
    public string Value { get; set; }
    public string Title { get; set; }
}

我需要表示一个树状结构,其中有三个级别的数据。实施例

 ParentNode
     ChildNode

 ParentNode
     ChildNode
         GrandChildNode
         GrandChildNode

我试图尽可能地做到一般/干净,以便我可以重用从数据库中获取此信息的服务。

任何Sugestions?

1 个答案:

答案 0 :(得分:5)

您可以修改您的类以适应类似树的层次结构。

public class Node
{
    public string Text { get; set; }
    public string Value { get; set; }
    public string Title { get; set; }

    public Node Parent { get; private set; }
    public ICollection<Node> Children { get; private set; }

    public IEnumerable<Node> Ancestors() {
        Node current = this.Parent;
        while (current != null) {
            yield return current;
            current = current.Parent;                
        }
    }

    public IEnumerable<Node> Descendants() {
        foreach (Node c in this.Children) {
            yield return c;
            foreach (Node d in c.Descendants())
                yield return d;
        }
    }

    // Root node constructor
    public Node() {
        this.Children = new List<Node>();     
    }

    // Child node constructor
    public Node(Node parent) : this() {
        this.Parent = parent;
        parent.Children.Add(this);
    }
}

然后您可以这样使用它:

Node gramps = new Node() { Title = "Grandparent" };
Node dad = new Node(gramps) { Title = "Parent" };
Node son = new Node(dad) { Title = "Child" };