C# 删除实体时如何从集合中删除该实体
我有C# 删除实体时如何从集合中删除该实体,c#,collections,C#,Collections,我有Entity类,它有IsEntityDeleted属性和deleteeentity方法: public class Entity { public virtual bool IsEntityDeleted { get; internal set; } public void DeleteEntity() { // Other logics... IsEntityDeleted = true; } } 如您所见,当我调用Del
Entity
类,它有IsEntityDeleted
属性和deleteeentity
方法:
public class Entity
{
public virtual bool IsEntityDeleted { get; internal set; }
public void DeleteEntity()
{
// Other logics...
IsEntityDeleted = true;
}
}
如您所见,当我调用DeleteEntity
方法时,IsEntityDeleted
将为true。在很多地方,我有很多收藏。我不想将删除的实体保留到集合中。集合类是自定义的:
public class MyVirtualCollection<T> : ICollection<T> where T : Entity
{
ICollection<T> Items { get; set; }
public MyVirtualCollection(ICollection<T> source)
{
Items = source;
}
public int Count => Items.Count;
public bool IsReadOnly => Items.IsReadOnly;
public void Add(T item)
{
Items.Add(item);
}
public void Clear()
{
Items.Clear();
}
public bool Contains(T item)
{
return Items.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
Items.CopyTo(array, arrayIndex);
}
public IEnumerator<T> GetEnumerator()
{
return Items.GetEnumerator();
}
public bool Remove(T item)
{
return Items.Remove(item);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
公共类MyVirtualCollection:ICollection其中T:Entity
{
ICollection项{get;set;}
公共MyVirtualCollection(ICollection源)
{
项目=来源;
}
public int Count=>Items.Count;
public bool IsReadOnly=>Items.IsReadOnly;
公共作废新增(T项)
{
项目。添加(项目);
}
公共空间清除()
{
Items.Clear();
}
公共布尔包含(T项)
{
返回项目。包含(项目);
}
public void CopyTo(T[]数组,int arrayIndex)
{
Items.CopyTo(数组、数组索引);
}
公共IEnumerator GetEnumerator()
{
返回项。GetEnumerator();
}
公共布尔删除(T项)
{
返回项目。删除(项目);
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
以下是用例:
var firstEntity = new Entity();
var secondEntity = new Entity();
var list = new List<Entity>();
list.Add(firstEntity);
list.Add(secondEntity);
MyVirtualCollection<Entity> entities = new MyVirtualCollection<Entity>(list); // entities.Count is 2 here
firstEntity.DeleteEntity(); // entities.Count should be 1
secondEntity.DeleteEntity(); // entities.Count should be 0
var firstEntity=新实体();
var secondEntity=新实体();
var list=新列表();
列表。添加(第一实体);
列表。添加(第二实体);
MyVirtualCollection实体=新的MyVirtualCollection(列表);//实体。这里的计数是2
firstEntity.DeleteEntity();//实体。计数应为1
secondEntity.DeleteEntity();//实体。计数应为0
当
IsEntityDeleted
成为现实时,是否可以从MyVirtualCollection
集合中删除实体?我认为您将从集合中删除项目的责任委托给了实体。在我看来,这是错误的,这违反了坚实的原则:单一责任。现在,MyVirtualCollection
类负责删除项,但它不知道Entity
类中的DeleteEntity()
方法。如果希望以任何方式从集合中删除实体,则应在实体类中公开一个事件,该事件通知集合她必须实际删除de实体:
delegate void RemoveEventDelegate(Entity entity);
public class Entity
{
public event RemoveEventDelegate OnEntityDeleted;
public virtual bool IsEntityDeleted { get; internal set; }
public void DeleteEntity()
{
// Other logics...
IsEntityDeleted = true;
if (OnEntityDeleted != null)
{
OnEntityDeleted(this);
}
}
}
并订阅集合中的OneTityDeleted事件
public class MyVirtualCollection<T> : ICollection<T> where T : Entity
{
ICollection<T> Items { get; set; }
private void Suscribe(Entity entity)
{
Items.Remove(entity);
}
public MyVirtualCollection(ICollection<T> source)
{
Items = source;
foreach(var ent in Items)
{
ent.OnEntityDeleted += Suscribe;
}
}
public int Count => Items.Count;
public bool IsReadOnly => Items.IsReadOnly;
public void Add(T item)
{
Items.Add(item);
item.OnEntityDeleted += Suscribe;
}
public void Clear()
{
foreach(var ent in Items)
{
ent.OnEntityDeleted -= Suscribe;
}
Items.Clear();
}
public bool Contains(T item)
{
return Items.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
Items.CopyTo(array, arrayIndex);
}
public IEnumerator<T> GetEnumerator()
{
return Items.GetEnumerator();
}
public bool Remove(T item)
{
item.OnEntityDeleted -= Suscribe;
return Items.Remove(item);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
公共类MyVirtualCollection:ICollection其中T:Entity
{
ICollection项{get;set;}
专用作废凭证(实体)
{
项目。移除(实体);
}
公共MyVirtualCollection(ICollection源)
{
项目=来源;
foreach(项目中的变量)
{
ent.OnEntityDeleted+=支持;
}
}
public int Count=>Items.Count;
public bool IsReadOnly=>Items.IsReadOnly;
公共作废新增(T项)
{
项目。添加(项目);
item.OnEntityDeleted+=子项;
}
公共空间清除()
{
foreach(项目中的变量)
{
ent.OnEntityDeleted-=支持;
}
Items.Clear();
}
公共布尔包含(T项)
{
返回项目。包含(项目);
}
public void CopyTo(T[]数组,int arrayIndex)
{
Items.CopyTo(数组、数组索引);
}
公共IEnumerator GetEnumerator()
{
返回项。GetEnumerator();
}
公共布尔删除(T项)
{
item.OnEntityDeleted-=子项;
返回项目。删除(项目);
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
请注意,当您调用
DeleteEntity()
方法时,它将从所涉及的所有集合中删除该实体。@Dllshod为什么不能使用Remove方法本身来删除项,因为ICollection实现了Add()和Remove()方法。@SteadyReader,因为有很多集合,不想为每个集合调用Remove。我想把它去掉automatically@Dllshod,所以您想为几个实体删除它,但会根据该属性值自动删除?@SteadyReader,我不明白“为几个实体删除它”是什么意思。看看它的用途case@Dllshod,是的,我明白你的意思了,不管怎样,你需要另一个标志,在实体iself或其他什么地方说“IsSoftDelete”。i、 e.假设为firstEntity.IsSoftDelete=true
和second.IsSoftDelete=false
并在DeleteEntity方法中使用“IsSoftDelete”,无论您是否要删除它。