2011-10-18 5 views
0

私はこの周りに私の頭を得るように見えることはできません。私は、ツリーメニューを構築するためにいくつかのテストデータを構築する必要がありますが、それはちょうど行くか、私は子供の最初のレベルを取得するため、stackverflowエラーが発生します。ここに私が現在持っているコードはあります:再帰的メソッドを使用してツリーメニューを構築するためのデータをテストしますか?

private MenuItem _menuItem; 
private int _start = 1; 
private const int Stop = 5; 

public void BuildMenu() 
{ 
    var numberOfChildren = new Random((int) DateTime.Now.Ticks).Next(3, 40); 
    AutoMapper.Mapper.CreateMap<MenuItem, MenuItemDto>().ConvertUsing<MenuItemConverter>(); 
    _menuItem = new MenuItem() {Id = Guid.NewGuid(), Name = "Main Menu"}; 
    _menuItem.ChildMenuItems = BuildChildItems(_menuItem, numberOfChildren); 

    var menuDto = AutoMapper.Mapper.Map<MenuItem, MenuItemDto>(_menuItem); 
} 

public ICollection<MenuItem> BuildChildItems(MenuItem parentMenuItem, int numberOfChildren) 
{ 
    var childItems = new Collection<MenuItem>(); 

    _start += 1; 

    for (var i = 0; i <= numberOfChildren; i++) 
    { 
     var childItem = new MenuItem() 
          { 
           Id = Guid.NewGuid(), 
           ParentItemId = parentMenuItem.Id, 
           Parentitem = parentMenuItem, 
           Name = "Child Menu Item " + DateTime.Now 
          }; 

     if (_start != Stop) 
     { 
      childItem.ChildMenuItems = BuildChildItems(childItem, numberOfChildren); 
     } 

     childItems.Add(childItem); 
    } 

    return childItems; 
} 

public class MenuItem 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public Guid? ParentItemId { get; set; } 
    public MenuItem Parentitem { get; set; } 
    public ICollection<MenuItem> ChildMenuItems { get; set; } 
} 

これは動作しますが、_startとStop変数に気づくでしょう。私はそれらを入れて、私は、スタックオーバーフローを得ることはありませんが、明らかにそれは私が人口の多い子供のそれぞれの第一レベルを取得する理由です。私はどのレベルにいるのかを追跡する必要があると思っていますが、それをどのように追跡するのかはわかりません。なぜ今日空白を描いているのかわからない。

答えて

2

これは実際にあなたの特定のオブジェクトモデルを見るのではなく、アイデアを与える!あなたが行きたいレベルの数を表すintを持っています。これをメソッドに送り、0になるまで各回帰で減分します。

public void BuildChildItems(MenuItem parentMenuItem, int numberOfChildren, int level) 
{ 
    if(level == 0) return; 

    var results_for_this_level = create_results_for_this_level(); 
    parentMenuItem.Add(results_for_this_level); 


    foreach(sibling in results_for_this_level) 
    { 
    BuildChildItems(sibling, numberofChildren, level-1) //note the decrement of level here 
    } 
    } 
関連する問題