【发布时间】:2018-02-10 07:08:27
【问题描述】:
我一直在尝试使我的相等定义起作用,但发现 IEqualityComparer 似乎不起作用。
我的班级:
public class DBTileSimple
{
public int X;
public int Y;
public int Zoom;
public DBTileSimple(int x, int y, int z)
{
X = x;
Y = y;
Zoom = z;
}
}
测试 IEqualityComparer,所以它应该对任何对象都相等:
public class TileComparer : IEqualityComparer<DBTileSimple>
{
public bool Equals(DBTileSimple x, DBTileSimple y)
{
return true;
}
public int GetHashCode(DBTileSimple obj)
{
return 1;
}
}
结果:
DBTileSimple t1 = new DBTileSimple(10, 20, 17);
DBTileSimple t2 = new DBTileSimple(10, 20, 17);
Log.Info("t1 and t2 = " + (t1 == t2));
返回 t1 和 t2 = false
我的最终目标是将两个列表与这些对象进行比较并对它们进行逻辑运算(交集等)。
例如:
DBTileSimple t1 = new DBTileSimple(10, 20, 17);
DBTileSimple t2 = new DBTileSimple(10, 20, 17);
List<DBTileSimple> list1 = new List<DBTileSimple>();
list1.Add(t1);
List<DBTileSimple> list2 = new List<DBTileSimple>();
list2.Add(t2);
list1 = list1.Except(list2).ToList();
现在 list1 应该是空的,但它不是。
【问题讨论】:
-
您在使用
==时根本没有使用您的比较器。如果你想让它工作,你需要为operator ==添加一个重载。 -
==不会调用object.Equals。因此,您也应该覆盖它并让它调用Equals(反之亦然)。 -
== 运算符不使用 IEqualityComaprer。您需要重写 DBTitleSimple 类中的 Equals 方法。
-
它在处理列表时也不起作用。列表
list1 = 新列表 (); list1.Add(t1);列表 list2 = 新列表 (); list1.Add(t2); list1 = list1.Except(list2).ToList(); list1 现在应该是空的,但不是..