从包含泛型类

时间:2015-10-08 04:08:11

标签: c# .net generics

我试图从包含泛型类的列表中删除重复项。泛型类看起来像这样(剥离示例):

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中我需要自己的等号或比较器方法,但我不知道是否是这种情况,或者它们应该如何编写(除非我当然只是缺少一些简单的东西) )。

4 个答案:

答案 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。但要正确执行此操作,您必须制作xy只读字段

答案 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应该有所帮助。