2016-08-05 88 views
-4

需要以下问题的帮助。我对这个测试失败了,真的想知道答案,这样我可以研究它....使用递归获取父值和子值及其子元素的所有值

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

  • ID
  • 名称
  • parentId的

实施例(C#):

var b = new block(); 
b.id = 100; 
b.name = "block 100" 
b.value = 102.50; 
b.parentid = 99; 

编写一个递归函数,该函数接受一个I​​D作为唯一参数,并将遍历数组或未定尺寸和数量级别的列表。递归函数将计算


block block1 = new block(1, null, "block 1", 11.34M); 
    block block11 = new block(11, 1, "block 11", 234.34M); 
     block block111 = new block(111, 11, "block 111", 111); 
    block block12 = new block(12, 1, "block 12", 564); 
    block block13 = new block (13, 1, "block 13", 342.23M); 
     block block131 = new block(131, 13, "block 131", 945); 
     block block132 = new block(132, 13, "block 132", 10M); 
     block block133 = new block(133, 13, "block 133", 88M); 
     block block1331 = new block(1331, 133, "block 1331", 45); 

    block block2 = new block(2, null, "block 2", 234); 
    block block3 = new block(3, null, "block 3", 1249.34M); 

    blocks = new List<block>(); 
    blocks.Add(block1); 
    blocks.Add(block11); 
    blocks.Add(block111); 
    blocks.Add(block12); 
    blocks.Add(block13); 
    blocks.Add(block131); 
    blocks.Add(block132); 
    blocks.Add(block133); 
    blocks.Add(block1331); 
    blocks.Add(block2); 
    blocks.Add(block3); 

    decimal sum = SumAll(1); 
    Console.WriteLine(sum); 
    Console.ReadKey(); 
} 

我需要的功能,让我从父母和所有的孩子和孩子的孩子的“价值”财产共有“值”。谁能帮忙?


public class block 
{ 
    public block() { } 

    public block(int id, int? parentid, string name, decimal value) 
    { 
     this.id = id; 
     this.parentid = parentid; 
     this.name = name; 
     this.value = value; 
    } 

    public int id { get; set; } 
    public int? parentid { get; set; } 
    public string name { get; set; } 
    public decimal value { get; set; } 
} 
+1

你可以[编辑]你的问题;不要尝试在评论中粘贴代码。 – Blorgbeard

+3

另外:你需要问一个更具体的问题。 “请从我的复制+粘贴规范中实施此程序”不是问题。你写的代码有什么问题?发布你的尝试,并准确解释它的不正确。 – Blorgbeard

+0

看起来像你没有完成你的问题... – mmcrae

回答

0

为了让你感动(希望与您到目前为止已经试过什么编辑你的问题),你想是这样的:

// 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; 
} 
+0

非常感谢!这很有帮助。 –

0

这个工作对我来说:

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

只需致电sumAll(1)


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

就叫SumAll(blocks, 1)

+0

感谢您的回答。我的水平有点复杂,但我肯定会研究这一点。 –

+0

@HarrisStephanie - 这是更好吗? – Enigmativity

+0

是的,但最初的要求是您只能传递父ID。如果没有这种限制,这很好地工作。再次感谢! –

相关问题