自定义数据类型的非唯一元素

时间:2013-04-01 13:15:04

标签: c#

我正在尝试获取自定义数据类型的唯一元素列表。我真的不明白为什么这不起作用。控件永远不会达到以下代码中的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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

bool Equals(Rectangle obj1, Rectangle obj2)

是Object的静态方法,因此无法覆盖。

您必须改为覆盖实例Equals。

public override bool Equals(Object obj) {
    ...
}

答案 2 :(得分: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 =)

答案 3 :(得分:1)

您正在实施错误的界面。您的班级实施IEqualityComparer<Rectangle>,而不是IEquatable<Rectangle>。除非您传入 IEqualityComparerDistinct,否则它将使用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()));
    }
}

此外,您的widthheightstring而不是数字类型的特殊原因是什么?这似乎很奇怪,并且可能导致奇怪的错误,例如假设"100""0100"" 100 "相等,实际上它们是不同的字符串并且将具有不同的哈希码。 / p>