从包含泛型类的列表中删除重复项
本文关键字:删除 列表 包含 泛型类 | 更新日期: 2023-09-27 18:16:39
我试图从包含泛型类的列表中删除重复项。泛型类看起来像这样(剥离后的示例):
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
中需要自己的equals或comparator方法,但我不知道情况是否如此,或者它们应该如何编写(当然,除非我只是错过了一些简单的东西)。
要做到这一点,您需要重写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
只读字段
可以使用匿名对象。无论如何,这将改变引用。因此,只有当你不需要以前的引用时才使用它。
pointList = pointList.Select(x => new {x.x,x.y}).Distinct().Select(x => new Point2D<int>(x.x, x.y)).ToList();
您需要实现
IEquatable<T>
这个自定义类的接口。查看此链接了解更多细节和示例:
https://msdn.microsoft.com/en-us/library/vstudio/bb348436 (v = vs.100) . aspx
我建议重写==
操作符。