总结树上的值

时间:2011-04-17 06:15:47

标签: c# linq recursion tree aggregate

我使用Tree控件来查看基于嵌套(父子)表的一些分层项。

每个节点都有一个NameValue格式,可以接受名称和值。

但只有Leaves(最后一个节点)具有整数值,并且父项的值保留为空(只有它们所具有的名称)。

我想总结一下值,以便每个父节点都保存它的子节点的总和并留下值。

我认为完成此任务需要递归或LINQ,但我不知道如何?

也许一些伪代码对我有帮助。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是未经测试的,但我认为可能会设置所有节点的所有值:

public void SetNodeValues(Node node)
{
    if (node.Name == String.Empty)
    {
        //If it has no name it is a leaf, which needs no value
        return;
    }
    else
    {
        //Make sure all child-nodes have values
        foreach (var childNode in node.ChildNodes)
        {
            SetNodeValues(childNode);
        }

        //Sum them up and set that as the current node's value
        node.Value = node.ChildNodes.Sum(x => x.Value);
    }
}

答案 1 :(得分:0)

这将为你做到:

class Node
{
    public Node()
    {
        Children = new List<Node>();
    }

    public IEnumerable<Node> GetSubTree()
    {
        return Children.SelectMany(c => c.GetSubTree()).Concat(new[] { this });
    }

    public List<Node> Children { get; set; }
    public string Value { get; set; }
}

class Tree
{
    public Tree()
    {
        Root = new Node();
    }

    public IEnumerable<Node> GetAllNodes()
    {
        return Root.Children.SelectMany(root => root.GetSubTree()); 
    }

    Node Root { get; set; }

    //This is the Property you want:
    public int GetValuesSum
    {
        get
        {
            return GetAllNodes().Where(node => !string.IsNullOrEmpty(node.Value)).Sum(node => Convert.ToInt32(node.Value));
        }
    }
}

参考:How can I get a List from all nodes in a tree using LINQ?