gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:56:42 25 4
gpt4 key购买 nike

我正在尝试从包含通用类的列表中删除重复项。通用类看起来像这样(剥离后的例子):

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 字段设置为只读字段

关于c# - 从包含泛型类的列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33006439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com