2013-02-18 64 views
0

我有一個List<Leaf>在C#中命名爲items。葉具有以下屬性:用C刪除樹分支#

public class Leaf 
{ 
    public int ID { get; set; } 

    public int ParentID { get; set; } 

    public bool IsFlagged { get; set; } 
} 

如果葉有IsFlagged屬性設置,然後我需要從項目的集合中刪除。另外,我需要刪除所有Leaf實體的子項。我試圖找出編寫這段代碼的最優雅的方式。目前,我有一個循環內的循環,但似乎馬虎。

有誰知道一個優雅的方式來做到這一點?

+0

你能向我們展示迄今爲止的代碼嗎? – Andorbal 2013-02-18 21:29:28

+1

你是什麼意思的「葉子實體兒童」?如果它是一片葉子,它不應該是沒有孩子的嗎? – SWeko 2013-02-18 21:31:44

+0

@Sekek看起來這個班級名字不正確。它應該可能被稱爲'Node'。 – Servy 2013-02-18 21:32:45

回答

0

也許:

void RemoveItAndChildren(Leaf leaf) 
{ 
    foreach (Leaf item in items) 
     if (item.ParentID == leaf.ID) 
      RemoveItAndChildren(item); 
    items.Remove(leaf); 
} 

而且使用這樣:

foreach (Leaf leaf in items) 
    if (leaf.IsFlagged) 
     RemoveItAndChildren(leaf); 

注意的是,如上面註釋,正如下面的內容可能更合適:

public class Leaf2 
{ 
    List<Leaf2> Children; 
    bool IsFlagged { get; set; } 
} 
+0

@Servy Yup。這正是我的代碼所做的。 (並注意它先去掉孩子,以免讓他們失去孩子。) – ispiro 2013-02-18 21:41:59

+0

對,錯過了。請注意,這是一個特別低效的解決方案,因爲您以嵌套的方式多次迭代列表。 – Servy 2013-02-18 21:47:03

+0

但是,如果你有一個五層深的樹,一片葉子在第三層?這是我遇到問題的地方。該解決方案只能解決頂級問題。 – 2013-02-18 21:48:02

0

處理樹最合理(也可能是「最優雅」)的方式是將其存儲爲樹,而不是數組/列表。在這種情況下,您不需要處理步行元素就可以找到所有的孩子。

請注意,根據您的實際需求,樹可能不是最佳的數據結構,但對於刪除具有所有子節點的節點,將很難擊敗常規樹。