我需要找到两个集合之间的区别,集合的元素是自定义类的实例。
为了找到差异,我想使用 linq 方法except,该方法的描述说,对于自定义类型,您需要做以下两件事之一:
从原始类继承自定义类IEquatable<T>并覆盖Equals&方法GetHashCode
public class OperationItem: IEquatable<OperationItem>
{
public bool Equals(OperationItem other)
{
if (other is null)
return false;
return this.Name == other.Name && this.Code == other.Code;
}
public override bool Equals(object obj) => Equals(obj as OperationItem);
public override int GetHashCode() => (Name, Code).GetHashCode();
}
或者通过实现接口IEqualityComparer<T>和实现我们已经知道的方法来创建我们需要的比较器Equals&GetHashCode
public class OperationItemComparer: IEqualityComparer<OperationItem>
{
public bool Equals(OperationItem x, OperationItem y)
{
/*Реализация*/
}
public int GetHashCode(OperationItem obj)
{
/*Реализация*/
}
}
使用一种或另一种方法是否有显着差异,如果无法更改原始类,我假设使用第二种方法,但使用一种或另一种方法可能还有其他原因?
接口的类型实现
IEquatable<>添加了等价关系作为类型本身的自然属性。之后,任何集合和任何算法都会默认使用这种关系!从这里开始有一些限制:方法必须考虑到类的所有属性,以避免将来出现意外
Equals。GetHashCode此外,这些方法不能考虑任何与被检查对象无关的无关数据。同时,实现中
IEqualityComparer<>增加了一些等价关系,可以用也可以不用。这种实现通常可以是私有的,并且只在一个地方使用。此实现可能会考虑一些外部设置(例如,StringComparer来自标准库,它允许您指定如何比较字符串)。最后,可以有很多这样的实现,并且它们不会相互干扰。