IEqualityComparer根本不工作

时间:2017-09-01 08:51:41

标签: c# object compare

我一直试图让我的等式定义工作,但发现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应为空但不是。

3 个答案:

答案 0 :(得分: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));

如果您希望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;
    }
}

请注意,您需要重载==!=(如luxun所示,请参阅MSDN guidelines)。

编辑后

更新:

要将比较器与Except一起使用,您只需传递一个实例:

list1 = list1.Except(list2, new TileComparer()).ToList();

答案 1 :(得分:0)

你需要像这样实现==运算符:

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);
}

答案 2 :(得分:0)

覆盖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对象相等的其他逻辑,那么我认为最好创建另一个处理这个逻辑的方法。平等必须作为比较两个对象平等的一种方式,否则可能会在未来引起混淆。