我正在尝试获取自定义数据类型的唯一元素列表。我真的不明白为什么这不起作用。控件永远不会达到以下代码中的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();
答案 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>
。除非您传入 IEqualityComparer
到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
和height
是string
而不是数字类型的特殊原因是什么?这似乎很奇怪,并且可能导致奇怪的错误,例如假设"100"
和"0100"
和" 100 "
相等,实际上它们是不同的字符串并且将具有不同的哈希码。 / p>