2013-03-22 78 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