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)