如何在c#列表中删除重复项
本文关键字:删除 列表 | 更新日期: 2023-09-27 18:05:57
我有一个由基于x和y位置的一堆位置组成的列表,我正在取两个位置的差异。例如,我有(0,1)(1,0)和(1,2)(2,1)和(2,3)(3,2)这样的重复。我想从我的清单中删除所有重复的东西来实现我的目标。有简单的方法吗?我一直在尝试建立一个算法,但这很难。因为我有大约90个位置当它复制时很难确定
最简单的解决方案是为您的点类创建一个IEqualityComparer
,它不关心您的X
和Y
的顺序,然后您可以使用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();
}
}
我将使用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();