如何使集合在执行Collection.Remove时停止调用Equals

时间:2017-02-17 11:24:11

标签: c# .net

我有一个类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;
        }
     }

4 个答案:

答案 0 :(得分:2)

我认为你在这里忽略了这一点。 Equals方法正在实现等价的算术关系,就像具有自反,对称和传递的属性一样。没有两种不同的方式可以说两个对象是相等的,你知道吗?

您的解决方案是删除Equals方法的实现。当且仅当一个类只有一个等价定义时才会覆盖此方法 - 如整数相等 - 只有一种方法可以测试两个整数是否相等。

此外,这就是Remove方法不接受IComparerIEqualityComparer等其他参数的原因 - 这是不合理的。

在相关说明中:实体永远不会覆盖Equals。没有为可以随时间改变其状态的对象定义的等式关系(在数学术语中),并且实体被定义为具有生命期的对象。麻烦在于您可以选择同一实体的两个版本并询问它们是否相等。嗯,它们都是相同的(即同一个实体)并且不相等(它们是两个版本)。因此,Equals方法不是检查实体相等性的方法。

答案 1 :(得分:1)

简短的回答是,你不能。

从列表中删除项目的方式是通过对列表中每个条目的相关项目进行相等性检查来完成。

然而,可能有某种方法可以做到这一点,但我怀疑这是一个很好的做法,甚至是理想的代码。

答案 2 :(得分:0)

您可以将列表包装到另一个使用自定义IEqualityComparer实现的列表中。允许比较器有两种不同的模式(传递给object.Equals,或者不要)并在删除之前切换它们(然后再切换回来)。

答案 3 :(得分:0)

您可以找到要删除的项目的索引(不使用其等号)并调用RemoveAt