IEqualityComparer根本不工作

Mic*_*rča 0 c# compare object

我一直试图使我的相等定义工作,但发现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应该是空的但不是.

Ren*_*ogt 5

你根本不使用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)