gpt4 book ai didi

c# - SequenceEqual 不在父类型中调用 Equals

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:54 26 4
gpt4 key购买 nike

父类型:

public class IdObject : IComparable<IdObject>, IEquatable<IdObject>
{
public int id { get; set; }

public bool Equals(IdObject other)
{
if (other == null) return this == null;
if (this == null) return false;
var test = other.id.CompareTo(this.id);

return other.id.CompareTo(this.id) == 0;
}

public int CompareTo(IdObject other)
{
return other.id.CompareTo(this.id);
}
}

一个 child :

public class NamedObject : IdObject
{
public string name { get; set; }
}

比较 IdObject 的列表

var list1 = new List<IdObject>()
{
new IdObject() { id = 42 },
new IdObject() { id = 43 }
};
var list2 = new List<IdObject>()
{
new IdObject() { id = 43 },
new IdObject() { id = 42 }
};
list1.Sort();
list2.Sort();
var test = list1.SequenceEqual(list2); // True

比较 Named 的列表

var list1 = new List<NamedObject>()
{
new NamedObject() { id = 42 },
new NamedObject() { id = 43 }
};
var list2 = new List<NamedObject>()
{
new NamedObject() { id = 43 },
new NamedObject() { id = 42 }
};
list1.Sort();
list2.Sort();
var test = list1.SequenceEqual(list2); // False

我意识到 IdObject::Equals 不是通过 NamedObject 上下文调用的。

我做错了什么吗?
不应该调用继承的 Equals 吗?
我怎样才能使用 parent 的 Equals

最佳答案

基本上,您遇到了问题,因为您的类型没有覆盖 object.Equals(object)以与您的 IEquatable<T> 一致的方式实现并且您正在处理子类的集合。

SequenceEqual将使用 EqualityComparer<NamedObject>.Default .这将检查是否 NamedObject工具 IEquatable<NamedObject> - 并且会发现它没有,所以它会回退到调用 object.Equals(object) .你可以在这里看到:

using System;
using System.Collections.Generic;

public class Base : IEquatable<Base>
{
public override bool Equals(object other)
{
Console.WriteLine("Equals(object)");
return false;
}

public bool Equals(Base other)
{
Console.WriteLine("Equals(Base)");
return false;
}

public override int GetHashCode() => 0;
}

public class Derived : Base
{
}

public class Test
{
static void Main()
{
var comparer = EqualityComparer<Derived>.Default;
Console.WriteLine(comparer.Equals(new Derived(), new Derived()));
}
}

您不覆盖 object.Equals(object) ,因此您实际上已经获得了引用相等性。

我建议您覆盖 object.Equals(object)object.GetHashCode()在你的基类中。

可以然后也实现IEquatable<NamedObject>NamedObject ,只是委托(delegate)给基本实现或(更好)检查名称,除非您真的不希望将其考虑在内。

关于c# - SequenceEqual 不在父类型中调用 Equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45880914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com