C# 父节点包含所有子节点数据的总和

C# 父节点包含所有子节点数据的总和,c#,asp.net,recursion,tree,C#,Asp.net,Recursion,Tree,我已经为web应用程序创建了一个动态树。我的树结构如下所示: id name pid data1 data2 1 Item1 0 2 Item2 1 70 45 3 Item3 0 4 Item3 1 56 48 3 Item3 3 34 48 ........ 父节点不包含data1和

我已经为web应用程序创建了一个动态树。我的树结构如下所示:

id     name     pid     data1     data2

1      Item1    0 

2      Item2    1       70        45

3      Item3    0   

4      Item3    1       56        48

3      Item3    3       34        48
 ........
父节点不包含data1和data2的任何值。我已经为树创建了递归列表。但现在我需要做的是将所有子节点的data1和data2的值显示为父节点中的data1和data2的值

这棵树是多层次的。如何向每个父节点添加其子节点的值?我正在使用C#btw。谢谢

更新:

 public class MyTree
{
    public MyTree()
    {
        children = new List<MyTree>();
    }
    public int id { get; set; }
    public string data { get; set; }
    public int pid { get; set; }
    public decimal? data1 { get; set; }
    public decimal? data2 { get; set; }            
    public IList<MyTree> children { get; set; }
}
公共类MyTree
{
公共MyTree()
{
children=新列表();
}
公共int id{get;set;}
公共字符串数据{get;set;}
公共int-pid{get;set;}
公共十进制数?数据1{get;set;}
公共十进制数?数据2{get;set;}
公共IList子项{get;set;}
}

以下成员变量/更新属性对将给出一个显式值(如果已设置),或所有子级值的递归和(如果未设置):

private decimal? _data1;
public decimal? data1
{
    get
    {
        if (_data1.HasValue)
            return _data1;
        // This needs System.Linq but can be done manually.
        return children.Sum(c => c.data1);
    }
    set { _data1 = value; }
}
(对于
数据2类似)


它不会阻止您对具有子元素的元素显式设置值。

您可以发布正在使用的节点类吗?答案将涉及使用此函数递归遍历树。@MatthewWatson:请参阅节点类的更新部分。我正在使用递归函数设置节点中的值。因此,它将值0设置为所有父项。此外,上面的代码似乎将子对象的值设置为其父对象。将children的子级总和(如果有)等设置为根级或每个更高的父级是否有效?很抱歉我最后的评论。您的解决方案非常有效。谢谢。在我接受你的答案之前,让我再做一些测试。