【发布时间】:2022-01-08 08:51:13
【问题描述】:
我需要有一个 DispenseFile 类的实例,该类继承自实现 IDispenseEntity 的 DispenseEntity 使用自定义相等性来比较 List 中的元素。
我的界面是:
public interface IDispenseEntity : IEquatable<IDispenseEntity>
{
byte[] Id { get; set; }
List<byte[]> Key { get; }
List<byte[]> ParentKey { get; set; }
double Volume { get; set; }
public bool DispenseEnabled { get; set; }
string Name { get; set; }
}
我的 DispenseEntity 类:
public class DispenseEntity : IDispenseEntity, IEquatable<IDispenseEntity>
{
//Other properties and methods
//I've tried - this implements IEquatable:
public bool Equals(IDispenseEntity other)
{
return Id.SequenceEqual(other.Id);
}
//I've tried - this overrides default:
public override bool Equals(object obj)
{
return Id.SequenceEqual((obj as IDispenseEntity).Id);
}
}
我的 DispenseFile 类:
public class DispenseFile : DispenseEntity, IParent, IOutputable, IDispenseFile
{
//Other methods and properties
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
无论我在 DispenseEntity 类中为 Equals() 方法使用什么,当我尝试时它都不会被使用:
List<IDispenseEntity> before = _aList;
List<IDispenseEntity> after = _bList;
var intersect = before.Intersect(after).ToList();
相交列表有零个元素。
我非常肯定 _aList 和 _bList 都有一个 DispenseFile 实例,它继承了实现 IDispenseEntity 的 DispenseEntity。我编写了测试代码,可以在 _aList 中找到唯一的 DispenseFile 实体,并在 _bList 中找到 DispenseFile 的单个实例。这两个实例都是单独创建的,并且具有相同的属性 Id (new byte[] {1,2,3,4})
我尝试过覆盖 Equals。我已经尝试将 IEquatable 添加到基类并实现 equals 和 GetHashCode 并且没有使用。
问题一定是我自己,我做错了什么?
【问题讨论】:
-
GetHashCode 绝对会 被使用,如果你覆盖 Equals,你应该肯定覆盖它。请提供minimal reproducible example,它会更容易为您提供帮助。
-
Intersect 在内部使用 HashSet;您必须覆盖 GetHashCode,因为它用于首先判断列表 A 中的集合是否包含列表 B 中的项目。如果您坚持使用默认的 GetHashcode,您将永远不会成功地与不同的实例相交
-
另请注意,实现
IEquatable<ISomeInterface>的类很奇怪。您通常应该为同一类型实现IEquatable(即DispenseEntity应该实现IEquatable<DispenseEntity>)
标签: c# linq iequatable