我有一个类Test
,它有一个覆盖“等于”方法的方法,然后我有一个TestCollection
类,使用ICollection<Test>
&amp;集合中的IEnumerable<Test>
我已经实现了Remove方法,它只是从当前item
对象中删除了TestCollection
。
每当我为TestCollection
对象类删除方法时,这内部调用“等于”方法,该方法在Test
类被覆盖。
对于我的一个场景,我不希望调用此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;
}
}
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;
}
}
答案 0 :(得分:2)
我认为你在这里忽略了这一点。 Equals
方法正在实现等价的算术关系,就像具有自反,对称和传递的属性一样。没有两种不同的方式可以说两个对象是相等的,你知道吗?
您的解决方案是删除Equals
方法的实现。当且仅当一个类只有一个等价定义时才会覆盖此方法 - 如整数相等 - 只有一种方法可以测试两个整数是否相等。
此外,这就是Remove
方法不接受IComparer
或IEqualityComparer
等其他参数的原因 - 这是不合理的。
在相关说明中:实体永远不会覆盖Equals
。没有为可以随时间改变其状态的对象定义的等式关系(在数学术语中),并且实体被定义为具有生命期的对象。麻烦在于您可以选择同一实体的两个版本并询问它们是否相等。嗯,它们都是相同的(即同一个实体)并且不相等(它们是两个版本)。因此,Equals
方法不是检查实体相等性的方法。
答案 1 :(得分:1)
简短的回答是,你不能。
从列表中删除项目的方式是通过对列表中每个条目的相关项目进行相等性检查来完成。
然而,可能有某种方法可以做到这一点,但我怀疑这是一个很好的做法,甚至是理想的代码。
答案 2 :(得分:0)
您可以将列表包装到另一个使用自定义IEqualityComparer
实现的列表中。允许比较器有两种不同的模式(传递给object.Equals,或者不要)并在删除之前切换它们(然后再切换回来)。
答案 3 :(得分:0)
您可以找到要删除的项目的索引(不使用其等号)并调用RemoveAt