我试图从包含泛型类的列表中删除重复项。泛型类看起来像这样(剥离示例):
public class Point2D<T>
{
public T x;
public T y;
public Point2D(T x, T y)
{
this.x = x;
this.y = y;
}
}
我已经创建了这样的列表:
List<Point2D<int>> pointList = new List<Point2D<int>>();
pointList.Add(new Point2D<int>(1,1));
pointList.Add(new Point2D<int>(1,2));
pointList.Add(new Point2D<int>(1,1));
pointList.Add(new Point2D<int>(1,3));
我尝试删除重复项:
pointList = pointList.Distinct().ToList();
期望pointList
只包含:(1,1),(1,2),(1,3)但它仍然包含输入的所有四个点。我怀疑在Point2D
中我需要自己的等号或比较器方法,但我不知道是否是这种情况,或者它们应该如何编写(除非我当然只是缺少一些简单的东西) )。
答案 0 :(得分:4)
为此,您需要覆盖Equals方法:
public class Point2D<T>
{
public readonly T x;
public readonly T y;
public Point2D(T x, T y)
{
this.x = x;
this.y = y;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Point2D<T>) obj);
}
protected bool Equals(Point2D<T> other)
{
return EqualityComparer<T>.Default.Equals(x, other.x) && EqualityComparer<T>.Default.Equals(y, other.y);
}
public override int GetHashCode()
{
unchecked
{
return (EqualityComparer<T>.Default.GetHashCode(x)*397) ^ EqualityComparer<T>.Default.GetHashCode(y);
}
}
}
此外,您需要覆盖GetHashCode。但要正确执行此操作,您必须制作x
和y
只读字段
答案 1 :(得分:3)
您可以使用匿名对象。这怎么会改变参考文献。所以只有在你不需要以前的参考时才使用它。
pointList = pointList.Select(x => new {x.x,x.y}).Distinct().Select(x => new Point2D<int>(x.x, x.y)).ToList();
答案 2 :(得分:1)
您需要实施
IEquatable<T>
此自定义类的接口。查看此链接了解更多详情和样本:
https://msdn.microsoft.com/en-us/library/vstudio/bb348436(v=vs.100).aspx
答案 3 :(得分:-1)
我建议覆盖==
运营商。 This应该有所帮助。