C# 如何在执行收集时使收集停止调用等于。删除
我有一个类C# 如何在执行收集时使收集停止调用等于。删除,c#,.net,C#,.net,我有一个类Test,它有一个覆盖“Equals”的方法方法,然后我有一个TestCollection类,它是使用ICollection和IEnumerable实现的。在我实现的集合中,Remove方法只从当前TestCollection对象中删除项 每当我为TestCollection对象类删除方法时,它在内部调用“Equals”方法,该方法在Test类中被重写 在我的一个场景中,我不希望调用this Equals,还有什么其他方法可以在不调用Equals的情况下从集合中删除该项 下面是更好理解
Test
,它有一个覆盖“Equals”的方法方法,然后我有一个TestCollection
类,它是使用ICollection
和IEnumerable
实现的。在我实现的集合中,Remove方法只从当前TestCollection
对象中删除项
每当我为TestCollection
对象类删除方法时,它在内部调用“Equals”方法,该方法在Test
类中被重写
在我的一个场景中,我不希望调用this Equals,还有什么其他方法可以在不调用Equals的情况下从集合中删除该项
下面是更好理解的示例代码
测试班
public class Test
{
public int Id { get; set; }
private Collection<Test> _entities = new Collection<Test>();
public bool Remove(Test item)
{
return this._entities.Remove(item);
}
public override bool Equals(object obj)
{
Console.WriteLine("Equals inside Test Object");
return true;
}
}
公共类测试
{
公共int Id{get;set;}
私有集合_entities=新集合();
公共布尔删除(测试项)
{
返回此。\u实体。删除(项目);
}
公共覆盖布尔等于(对象对象对象)
{
Console.WriteLine(“等于测试对象内部”);
返回true;
}
}
TestCollection类
public class TestCollection : ICollection<Test>, IEnumerable<Test>
{
public TestCollection() : base() { }
private Collection<Test> _entities = new Collection<Test>();
public TestCollection(IList<Test> entityList)
{
this._entities = new Collection<Test>(entityList);
}
public bool Remove(Test item)
{
return this._entities.Remove(item);
}
public override bool Equals(object obj)
{
Console.WriteLine("Equals inside Test Collection Object");
return true;
}
}
公共类TestCollection:ICollection,IEnumerable
{
公共TestCollection():base(){}
私有集合_entities=新集合();
公共TestCollection(IList entityList)
{
此.\u实体=新集合(entityList);
}
公共布尔删除(测试项)
{
返回此。\u实体。删除(项目);
}
公共覆盖布尔等于(对象对象对象)
{
WriteLine(“等于测试集合对象内部”);
返回true;
}
}
您可以将该列表包装到另一个使用自定义IEqualityComparer
实现的列表中。允许该比较器具有两种不同的模式(传递到object.Equals或不传递),并在删除之前切换它们(然后切换回)。您可以将该列表包装到另一个使用自定义IEqualityComparer
实现的列表中。允许比较器有两种不同的模式(传递到object.Equals或不传递),并在移除之前切换它们(然后切换回)。简单的回答是您不能
从列表中删除项的方式是通过对列表中的每个条目上有问题的项进行相等性检查来完成的
不过,可能有一些方法可以做到这一点,但我怀疑这是一种好的做法,甚至是一种可取的代码。简单的回答是,您不能
从列表中删除项的方式是通过对列表中的每个条目上有问题的项进行相等性检查来完成的
但是,可能有某种方法可以做到这一点,但我怀疑这是一种好的做法,甚至是一种可取的代码。您可以找到要删除的项目的索引(不使用其等效项),然后调用RemoveAt
您可以找到要删除的项目的索引(不使用其等效项)然后打电话给RemoveAt
我想你没有抓住要点Equals
方法实现了等价的算术关系,比如具有自反、对称和传递的属性。没有两种截然不同的方式可以说两个物体是相等的,你知道吗
您的解决方案是删除Equals
方法的实现。当且仅当类一样的整数等式只有一个等价定义时,此方法才被重写—只有一种方法可以测试两个整数是否相等
另外,这也是Remove
方法不接受附加参数的原因,例如IComparer
或IEqualityComparer
——这是没有意义的
相关注意事项:实体不应覆盖
等于
。对于可以随时间改变状态的对象,没有定义相等关系(用数学术语),实体被定义为具有生命周期的对象。问题在于,您可以选择同一实体的两个版本,并询问它们是否相等。嗯,它们都是相等的(即同一个实体)和不相等的(这是它的两个版本)。因此,Equals
方法不是检查实体相等性的方法。我认为您没有抓住要点Equals
方法实现了等价的算术关系,比如具有自反、对称和传递的属性。没有两种截然不同的方式可以说两个物体是相等的,你知道吗
您的解决方案是删除Equals
方法的实现。当且仅当类一样的整数等式只有一个等价定义时,此方法才被重写—只有一种方法可以测试两个整数是否相等
另外,这也是Remove
方法不接受附加参数的原因,例如IComparer
或IEqualityComparer
——这是没有意义的
相关注意事项:实体不应覆盖等于
。对于可以随时间改变状态的对象,没有定义相等关系(用数学术语),实体被定义为具有生命周期的对象。问题在于,您可以选择同一实体的两个版本,并询问它们是否相等。嗯,它们都是相等的(即同一个实体)和不相等的(这是它的两个版本)。因此,Equals
方法不是检查实体相等性的方法