2013-03-22 82 views
1

這是一個我已經遇到好幾次的模式,我已經四處搜尋,但沒有就最佳方法達成共識。從父列表中刪除對象的最佳做法?

public class ItemListWrapper 
{ 
    public List<Item> Contents; 
} 

public class Item 
{ 
    void DoStuffAndRemove() { } 
} 

當DoStuffAndRemove()被調用時,我想的項目執行某些功能,然後從ItemListWrapper刪除。我能想到的兩種方法是讓ItemListWrapper實現IList(可行,但有點煩人,必須編寫所有樣板代碼),並將委託傳遞給每個項目以調用,從列表中刪除自己(似乎非常複雜) 。

任何幫助表示讚賞。謝謝。

+0

爲什麼要實施'IList'?您可以在「ItemListWrapper」中只定義一個'Remove'方法,而不必實現整個接口。 – 2013-03-22 17:01:28

+2

舊的'DoStuffAndRemoveFrom(List listFromWhichTheItemIsToBeRemoved)''怎麼了?然後你可以用'myItemListWrapper.Contents'調用它,並刪除所有關於該項目被刪除的列表的疑問。 – dasblinkenlight 2013-03-22 17:01:28

+0

隊列或堆棧可能比List更合適的數據結構?例如,如果您的應用程序需要FIFO,您只需執行'DoStuff(queue.Dequeue());'。 – 2013-03-22 17:09:01

回答

2

我想你必須有這ItemListWrapper由於其他原因。讓我們來看看2點的方法:

1.每件商品都有它的一個引用的名單

public class ItemListWrapper 
{ 
    public List<Item> Contents; 

    public void Add(Item item){ item.List = this; this.Contents.Add(item); } 
} 

public class Item 
{ 
    ItemListWrapper List; 
    void DoStuffAndRemove() { this.List.Contents.Remove(this); } 
} 

2.讓列表控件一切

public class ItemListWrapper 
{ 
    public List<Item> Contents; 

    public void DoStuffAndRemove(Item item) 
    { 
     if(this.Contents.Contains(item)) 
     { 
      item.DoStuff(); 
      this.Contents.Remove(item); 
     } 
    } 
} 

public class Item 
{ 
    void DoStuff() { ... } 
} 

恕我直言,第二個是更好因爲我明白列表必須對其項目負責。

+0

請注意,在這兩種情況下,只有在直接訪問列表的權限被禁止時,它們才能工作。 – Servy 2013-03-22 17:34:32

+0

@Servy實際上,即使列表是私有的,第二個選項也可以工作,因爲它在'ItemListWrapper'內實現。無論如何,可能有一個方法,如'void RemoveIfContains(Item item)' – 2013-03-22 17:36:46