2016-08-05 86 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。如果沒有這種限制,這很好地工作。再次感謝! –

相關問題