C# 从父对象列表中删除对象的最佳实践?

C# 从父对象列表中删除对象的最佳实践?,c#,.net,collections,C#,.net,Collections,这是一个我已经遇到过好几次的模式,我已经四处搜索过了,但还没有找到关于什么是最佳方法的共识 public class ItemListWrapper { public List<Item> Contents; } public class Item { void DoStuffAndRemove() { } } public类ItemListWrapper { 公开列表内容; } 公共类项目 { void DoStuffAndRemove(){} } 调用DoSt

这是一个我已经遇到过好几次的模式,我已经四处搜索过了,但还没有找到关于什么是最佳方法的共识

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

public class Item
{
   void DoStuffAndRemove() { }
}
public类ItemListWrapper
{
公开列表内容;
}
公共类项目
{
void DoStuffAndRemove(){}
}
调用DoStuffAndRemove()时,我希望该项执行一些函数,然后从ItemListWrapper中删除。我能想到的两种方法是让ItemListWrapper实现IList(可行,但必须编写所有样板代码有点烦人)和向每个要调用的项传递一个委托,这会将其自身从列表中移除(看起来非常复杂)

感谢您的帮助。谢谢。

出于其他原因,我想您一定有这个
ItemListWrapper
。让我们看两种方法:

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); }
}
public类ItemListWrapper
{
公开列表内容;
public void Add(Item){Item.List=this;this.Contents.Add(Item);}
}
公共类项目
{
ItemListWrapper列表;
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() { ... }
}
public类ItemListWrapper
{
公开列表内容;
公共无效DoStuffAndRemove(项目)
{ 
if(此.Contents.Contains(项目))
{
项目.DoStuff();
本.目录.删除(项);
}
}
}
公共类项目
{
void DoStuff(){…}
}

IMHO,第二个更好,因为我知道列表必须对其项目负责。

为什么要实施
IList
?您只能在
ItemListWrapper
中定义一个
Remove
方法,而不实现整个接口。好的老`DoStuffAndRemoveFrom(列表列表从中删除项)
有什么问题?然后,您可以使用
myItemListWrapper.Contents`调用它,并消除关于必须从中删除该项的列表的所有疑问。队列或堆栈可能比列表更适合数据结构吗?例如,如果应用程序需要FIFO,只需执行
DoStuff(queue.Dequeue())。就像@PieterGeerkens所说的-问题是你们实际上是如何使用它的-你们有一些测试用例场景吗?您是否长期存储,这似乎是一种一次性的方法(您有更好的选择),如何访问它们以“完成任务”,顺序等。ItemListWrapper长期存储以管理一组对象,它们是随机和不经常访问的,用于执行某些工作。请注意,在这两种情况下,它们只有在禁止直接访问列表时才起作用。请注意,实际上,第二个选项即使列表是私有的,也会起作用,因为它是在
ItemListWrapper
中实现的。无论如何,可能有一种方法,例如
void removefcontains(Item)