从包含泛型类的列表中删除重复项

本文关键字:删除 列表 包含 泛型类 | 更新日期: 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。但是要正确地做到这一点,您必须使xy只读字段

可以使用匿名对象。无论如何,这将改变引用。因此,只有当你不需要以前的引用时才使用它。

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

我建议重写==操作符。