我一直试图使我的相等定义工作,但发现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;
}
}
Run Code Online (Sandbox Code Playgroud)
测试IEqualityComparer,因此对于任何对象都应该是相同的:
public class TileComparer : IEqualityComparer<DBTileSimple>
{
public bool Equals(DBTileSimple x, DBTileSimple y)
{
return true;
}
public int GetHashCode(DBTileSimple obj)
{
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
DBTileSimple t1 = new DBTileSimple(10, 20, 17);
DBTileSimple t2 = new DBTileSimple(10, 20, 17);
Log.Info("t1 and t2 = " + (t1 == t2));
Run Code Online (Sandbox Code Playgroud)
返回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();
Run Code Online (Sandbox Code Playgroud)
现在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));
Run Code Online (Sandbox Code Playgroud)
如果你想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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要重载都==和!=(如鲁迅所暗示的,看MSDN准则).
编辑后更新:
要与Except您一起使用比较器,只需传递一个实例:
list1 = list1.Except(list2, new TileComparer()).ToList();
Run Code Online (Sandbox Code Playgroud)