我一直在试图使我的平等定义起作用,但发现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应该为空,但不是。
您完全不使用完全使用 TileComparer
。如果要使用它与DBTileSimple
实例进行比较,则可以这样做:
DBTileSimple t1 = new DBTileSimple(10, 20, 17);
DBTileSimple t2 = new DBTileSimple(10, 20, 17);
TileComparer comparer = new TileComparer();
Log.Info("t1 and t2 = " + comparer.Equals(t1, t2));
如果您要t1 == t2
工作,则必须超载该操作员:
public class DBTileSimple
{
//...
public static bool operator==(DBTileSimpe t1, DBTileSimpe t2)
{
return true;
}
public static bool operator!=(DBTileSimpe t1, DBTileSimpe t2)
{
return false;
}
}
请注意,您需要超载==
和!=
,请参阅Microsoft的指南。
您的编辑后更新:
要将您的比较与Except
一起使用,您只需要通过它的实例:
list1 = list1.Except(list2, new TileComparer()).ToList();
您需要像这样实现==运算符:
public static bool operator ==(DBTileSimple a, DBTileSimple b)
{
// Return true if the fields match:
return a.x == b.x && a.y == b.y && a.Zoom == b.Zoom;
}
public static bool operator !=(DBTileSimple a, DBTileSimple b)
{
return !(a == b);
}
覆盖equals()仅对
有效果t1.Equals(t2)
要使您的代码工作,您必须在dbtilesimple类中添加此代码:
public static bool operator ==(DBTileSimple x, DBTileSimple y)
{
return x.propA == y.propB;
}
请检查此链接以获取有关覆盖平等的更多信息:
https://msdn.microsoft.com/en-us/library/ms173147(v = vs.80).aspx
编辑:
除了两个dbtilesimple对象的平等之外,还需要执行其他逻辑,那么我认为最好创建另一种处理此逻辑的方法。平等必须保持作为比较两个对象的平等的一种方式,否则将来可能会引起混乱。