2012-06-05 39 views
0

我想獲得我如何能以有效的方式構建樹出來的物品清單

public class Item 
    { 
     public Item(int id, int? parentId) 
     { 
      Id = id; 
      ParentId = parentId; 
     } 

     public int Id { get; private set; } 
     public int? ParentId { get; private set; } 
     public List<Item> SubItems { get; set; } 
    } 

    private Item BuildATree() 
    { 
     var items = new List<Item>() 
         { 
          new Item(1, null), 
          new Item(2, 1), 
          new Item(3, 1), 
          new Item(4, 1), 
          new Item(5, 2), 
          new Item(6, 2), 
          new Item(7, 4), 
          new Item(8, 7), 
          new Item(9, 1), 
         }; 

     //Build a tree out of list items 
    } 

我期待的結果,建立一個樹出來的項目列表中的一些建議是每個項目是其父母的分項列出

不一定使用相同的項目類,因爲IDS是多餘然後

+2

,因爲這種結構已經開始成爲一個熱門話題這是一門功課。 http://stackoverflow.com/questions/10878268/recursive-reading-of-listobject,http://stackoverflow.com/questions/10827237/how-to-create-objects-with-retrieved-hierarchical-result-set –

+0

這不是一個家庭作業,我不是要求一個解決方案,我要求一些建議什麼是最有效的方法來解決它 – Jeff

+1

什麼是你的*低效*的方式,讓你尋求一個有效的方法? –

回答

2

解決方案是足夠有效的

private void RecursiveBuilder(ref Item i, IEnumerable<Item> li) 
{ 
    var item = i; 
    i.SubItems = (from n in li where n.ParentId == item.Id select n).ToList(); 
    i.SubItems.ForEach(f => RecursiveBuilder(ref f, li)); 
} 
2

我會使用LINQ:

//Build a tree out of list items 
foreach (Item item in items) 
{ 
    item.SubItems = items.Where(i => i.ParentId.Value == item.Id).ToList(); 
} 

UPD:

爲了簡化從一個父項到另一個項的移動項目,您需要在每個項目中存儲對父項目的引用。但要注意,你還需要一個更復雜一點 - 如果以這種方式然後就通過此屬性設置新的父項實施將足以修改新老父母的子項集合

public class Item 
{ 
    public Item(int id, int? parentId) 
    { 
     Id = id; 
     ParentId = parentId; 
    } 

    public int Id { get; private set; } 
    public int? ParentId { get; private set; } 
    public List<Item> SubItems { get; set; } 

    private Item _parent; 
    public Item Parent 
    { 
     get { return _parent; } 
     set 
     { 
      if (_parent != null) 
       _parent.SubItems.Remove(this); 
      _parent = value; 
      if (_parent != null) 
       _parent.SubItems.Add(this); 
     } 
    } 
} 

:喜歡的東西列表初始化機制。

+0

它可以是遞歸的,也可以從列表中刪除項目,如果它被移動到其他項目作爲子項目 – Jeff

+0

@Jeff:查看更新 –

+0

項目項目...大聲笑,這是最相似的LINQ,你可以得到沒有違反保留關鍵字恭喜:P – RhysW

1

如果你不希望/你有鏈接:

Dictionary<int,Item> dic = new Dictionary<int,Item>(); 
foreach(Item item in items) 
{ 
    Item parent; 
    if(item.ParentId!=null && dic.TryGetValue(item.ParentId, out parent)) 
     parent.SubItems.Add(item); 
    else 
     dic.Add(item.Id, item); 
} 
Item root = dic[1]; 

我推測總是會有與ID = 1項,這就是樹的根。

如果您想使用不帶ID的新類,請創建它們,而不是簡單地將它們添加到父母身上。