C# 使用递归获取父值、子值及其所有子值

C# 使用递归获取父值、子值及其所有子值,c#,recursion,C#,Recursion,需要以下问题的帮助。我在这方面测试失败了,我真的很想知道答案,这样我就可以研究它了 假设金字塔结构中的对象列表C具有以下属性: 身份证件 名称 价值 父节点 例C: var b = new block(); b.id = 100; b.name = "block 100" b.value = 102.50; b.parentid = 99; 编写一个递归函数,该函数接受ID作为唯一参数,并将循环遍历大小和级别数未知的数组或列表。递归函数将计算 为了让你行动起来,并希望用你迄今为止尝试过的方法编

需要以下问题的帮助。我在这方面测试失败了,我真的很想知道答案,这样我就可以研究它了

假设金字塔结构中的对象列表C具有以下属性:

身份证件 名称 价值 父节点 例C:

var b = new block();
b.id = 100;
b.name = "block 100"
b.value = 102.50;
b.parentid = 99;
编写一个递归函数,该函数接受ID作为唯一参数,并将循环遍历大小和级别数未知的数组或列表。递归函数将计算


为了让你行动起来,并希望用你迄今为止尝试过的方法编辑你的问题,你需要这样的东西:

// defined at class level/scope outside method
private List<block> blocks;

...

private int SumAll(int id) {
      var initialBlock = blocks.FirstOrDefault(b => b.id == id);
      int value = initialBlock.Value;

      var childBlocks = blocks.Where(b => b.parentId = id).ToList();
      foreach (var childBlock in childBlocks) {
            // recursive call for children
            value += SumAll(childBlock.id);
      }

      return value;
}
这对我很有用:

var lookup = blocks.ToLookup(x => x.parentid, x => x.id);
var map = blocks.ToDictionary(x => x.id);
Func<int, decimal> sumAll = null;
sumAll = n => map[n].value + lookup[n].Select(x => sumAll(x)).Sum();

打电话给SumAllblocks,1.

你可以回答你的问题;不要试图在注释中粘贴代码。另外:你需要问一个更具体的问题。请从我的复制+粘贴规范中执行此程序不是问题。你写的代码有什么问题?发布你的尝试,并准确解释它的错误之处。看起来你没有完成你的问题…对不起,这是我关于堆栈溢出的第一篇文章,我也匆匆完成了发布。mmcrae完全理解我的意思,他的功能对我很有用!非常感谢你!非常感谢你!这很有帮助。谢谢你的回答。对我的水平来说有点复杂,但我肯定会研究它。@HarrisStephanie-这更好吗?是的,但最初的要求是你只能通过家长id。如果没有限制,这很好。再次感谢@HarrisStephanie-有了这个限制,您必须将列表块作为类级变量。这是一个糟糕的设计。最好把它传进来。@mmcrae-你可能是对的,但我确实喜欢map[n]。value+lookup[n]。Selectx=>sumAllx.Sum;一旦您了解了映射和查找的功能,这一点就非常清楚了。
// defined at class level/scope outside method
private List<block> blocks;

...

private int SumAll(int id) {
      var initialBlock = blocks.FirstOrDefault(b => b.id == id);
      int value = initialBlock.Value;

      var childBlocks = blocks.Where(b => b.parentId = id).ToList();
      foreach (var childBlock in childBlocks) {
            // recursive call for children
            value += SumAll(childBlock.id);
      }

      return value;
}
var lookup = blocks.ToLookup(x => x.parentid, x => x.id);
var map = blocks.ToDictionary(x => x.id);
Func<int, decimal> sumAll = null;
sumAll = n => map[n].value + lookup[n].Select(x => sumAll(x)).Sum();
public decimal SumAll(List<block> blocks, int id)
{
    return SumAll(id, blocks.ToLookup(x => x.parentid, x => x.id), blocks.ToDictionary(x => x.id));
}

private decimal SumAll(int id, ILookup<int?, int> lookup, Dictionary<int, block> map)
{
    return map[id].value + lookup[id].Select(x => SumAll(x, lookup, map)).Sum();
}