0

我正在尝试获取自定义数据类型的唯一元素列表。我真的无法弄清楚为什么这不起作用。在下面的代码中,控件永远不会到达 Equals 实现。有人可以帮忙吗?

public class customobj : IEqualityComparer<customobj>
{
    public string str1;
    public string str2;

    public customobj(string s1, string s2)
    {
        this.str1 = s1; this.str2 = s2;
    }

    public bool Equals(customobj obj1, customobj obj2)
    {
        if ((obj1 == null) || (obj2 == null))
        {
            return false;
        }
        return ((obj1.str1.Equals(obj2.str1)) && (obj2.str2.Equals(obj2.str2)));

    }

    public int GetHashCode(customobj w)
    {
        if (w != null)
        {
            return ((w.str1.GetHashCode()) ^ (w.str2.GetHashCode()));
        }
        return 0;
    }
}

下面是我试图检索列表的不同元素的部分。

List<customobj> templist = new List<customobj> { };

templist.Add(new customobj("10", "50"));
templist.Add(new customobj("10", "50"));
List<customobj> dist = templist.Distinct().ToList();
4

4 回答 4

2

您的类不会覆盖对象类的基本 Equals() 并且Distinct()正在使用它。

尝试覆盖基本 Equals,并 Equals(Rectangle obj1, Rectangle obj2)从那里调用您的自定义。

此外,如果您想从类型比较器继承,请使用IEquatable<T>,但不要IEqualityComparer<Rectangle>

于 2013-04-01T13:19:21.093 回答
1

如果你想在 Rectangle 的类中实现 IEqualityComparer,你应该这样写:

List<Rectangle> dist = templist.Distinct(new Reclangle("","")).ToList();

通常它是通过一个 RectangleComparer 类来实现的:

class RectangleComparer : IEqualityComparer<Rectangle>
{
   public static IEqualityComparer<Rectangle> Instance { get {...} }
...
}

List<Rectangle> dist = templist.Distinct(RectangleComparer.Instance).ToList();

或覆盖 GetHashCode 和 Equals =)

于 2013-04-01T13:25:23.117 回答
1

您正在实现错误的接口。您的类实现IEqualityComparer<Rectangle>,而不是IEquatable<Rectangle>。除非您传入IEqualityComparerto Distinct,否则它将使用(如果您的IEquatable.Equals类实现它)或Object.Equals.

public class Rectangle : IEquatable<Rectangle>
{
    public string width;
    public string height;

    public Rectangle(string s1, string s2)
    {
        this.width = s1; this.height = s2;
    }

    `IEquatable.Equals
    public bool Equals(Rectangle obj2)
    {
        if (obj2 == null)
        {
            return false;
        }
        return ((this.width.Equals(obj2.width)) && (this.height.Equals(obj2.height)));

    }

    `override of object.Equals
    public override bool Equals(Object(o2)
    {
       if(typeof(o2) == typeof(Rectangle))
           return ((Rectangle)this.Equals((Rectangle)o2);

       return false;
    } 

    'override of object.GetHashCode
    public override int GetHashCode()
    {
        return ((this.width.GetHashCode()) ^ (thisw.height.GetHashCode()));
    }
}

width另外,您的and heightare strings 而不是数字类型是否有特殊原因?这看起来很奇怪,并且可能导致奇怪的错误,例如假设"100"and"0100"" 100 "是相等的,而实际上它们是不同的字符串并且将具有不同的哈希码。

于 2013-04-01T13:28:05.017 回答
1
bool Equals(Rectangle obj1, Rectangle obj2)

是Object的静态方法,所以不能被覆盖。

您必须改写实例 Equals。

public override bool Equals(Object obj) {
    ...
}
于 2013-04-01T13:23:18.423 回答