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”,无论您是否要删除它。