如何删除c#list中的重复项

时间:2016-09-06 14:20:28

标签: c# list duplicates

我有一个列表,包括基于x和y位置的一堆位置,我正在考虑两个位置的区别。因此,例如我有重复,如(0,1),(1,0)和(1,2),(2,1)和(2,3),(3,2)。我想删除列表中的所有重复项以实现我的目标。是否有捷径可寻?我一直在尝试构建算法,但这很难。因为我有90个位置,并且不容易确定它何时复制

2 个答案:

答案 0 :(得分:7)

最简单的解决方案是为您的点类创建IEqualityComparer,而不关心XY的顺序,然后您可以使用Distinct获取摆脱重复。

public class MyPoint
{
    public int X { get; set; }
    public int Y { get; set; }
}

public class PointComparer : IEqualityComparer<MyPoint>
{
    public bool Equals(MyPoint x, MyPoint y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null)) return false;
        if (ReferenceEquals(y, null)) return false;
        return (x.X == y.X && x.Y == y.Y) ||
               (x.X == y.Y && x.Y == y.X);
    }

    public int GetHashCode(MyPoint obj)
    {
        return (obj?.X.GetHashCode() ?? 0) ^ (obj?.Y.GetHashCode() ?? 0);
    }
}

class Program
{
    static void Main()
    {
        List<MyPoint> data = GetDataFromSomewhere();

        var singularData = data.Distinct(new PointComparer()).ToList();
    }
}

答案 1 :(得分:2)

我会将Enumerable.Distinct与自定义比较器一起用于逻辑:

public class OppositeLocationsEqualComparer : IEqualityComparer<Location>
{
    public bool Equals(Location l1, Location l2)
    {
        if (object.ReferenceEquals(l1, l2)) return true;
        if (l1 == null || l2 == null) return false;
        return (l1.X == l2.X && l1.Y == l2.Y) || (l1.X == l2.Y && l1.Y == l2.X);
    }

    public int GetHashCode(Location l)
    {
        if(l == null) return int.MinValue;
        return Math.Abs(l.X - l.Y);
    }
}

现在你可以在这个比较器中使用Enumerable.Distinct(以及许多其他LINQ方法):

List<Location> uniqueLocations = locationList
    .Distinct(new OppositeLocationsEqualComparer())
    .ToList();