Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在执行收集时使收集停止调用等于。删除_C#_.net - Fatal编程技术网

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
方法不是检查实体相等性的方法