C# 从其他列表中删除一个列表的元素
我有一张有分数的单子。我申请:C# 从其他列表中删除一个列表的元素,c#,.net,linq,list,C#,.net,Linq,List,我有一张有分数的单子。我申请: var result = neighbors.SelectMany(element => GenerateNeighbors(element)).Distinct<Point3D>().ToList<Point3D>(); var result=neights.SelectMany(element=>GenerateNeighbors(element)).Distinct().ToList(); 从该列表的每个点生成所有邻居。但我
var result = neighbors.SelectMany(element => GenerateNeighbors(element)).Distinct<Point3D>().ToList<Point3D>();
var result=neights.SelectMany(element=>GenerateNeighbors(element)).Distinct().ToList();
从该列表的每个点生成所有邻居。但我有另一个列表和其他点,这个邻居代可以生成已经添加到该列表中的点
如何从结果列表中删除其他列表中重复的元素?任何带有谓词的linq函数我都可以用来改进它吗
非常感谢
编辑
新代码:
class Point3D : IEquatable<Point3D>
{
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
public bool visited { get; set; }
public int life { get; set; }
public Point3D(int _x, int _y, int _z)
{
this.X = _x;
this.Y = _y;
this.Z = _z;
this.visited = false;
this.life = 2;
}
public int GetHashCode(Point3D obj)
{
throw new NotImplementedException();
}
public override Boolean Equals(object o)
{
if (!(o is Point3D)) return false;
return Equals((Point3D)o);
}
public Boolean Equals(Point3D p)
{
return Equals(this, p);
}
public static Boolean Equals(Point3D a, Point3D b)
{
return a.X == b.X && a.Y == b.Y && a.Z == b.Z;
}
}
class Point3D:IEquatable
{
公共整数X{get;set;}
公共整数Y{get;set;}
公共int Z{get;set;}
公共布尔访问{get;set;}
公共int-life{get;set;}
公共点3D(整数x,整数y,整数z)
{
this.X=X;
this.Y=\u Y;
this.Z=Z;
this.visted=false;
这就是生命=2;
}
公共int GetHashCode(Point3D obj)
{
抛出新的NotImplementedException();
}
公共覆盖布尔等于(对象o)
{
如果(!(o为Point3D))返回false;
返回等于((点3d)o);
}
公共布尔等于(点3D p)
{
回报等于(这个,p);
}
公共静态布尔等于(点3D a、点3D b)
{
返回a.X==b.X&&a.Y==b.Y&&a.Z==b.Z;
}
}
您可以使用Linq扩展方法:
result = result.Except(otherList).ToList();
您的Point3D
类应该提供Equals
/GetHashCode
的适当实现(是的,您必须实现它,抛出NotImplementedException
将不起作用)或实现(更明确)才能起作用,或者,您可以将自定义的IEqualityComparer
作为第二个参数传递给Except()
您可以使用Linq扩展方法:
result = result.Except(otherList).ToList();
您的
Point3D
类应该提供Equals
/GetHashCode
的适当实现(是的,您必须实现它,抛出NotImplementedException
将不起作用)或实现(更明确)才能起作用,或者,您也可以将自定义的IEqualityComparer
作为第二个参数传递给Except()
,是这样吗?我是否正确实现了比较器?我不这么认为,因为我有一个“if(!pointsInSurface.Contains(neights[I])”,我多次向这个pointsInSurface列表添加相同的点。我应该如何编写它?@Pedro:比较器应该是一个单独的类-您可能想实现IEQuatable
。@PedroDusso:您仍然需要实现GetHashCode()
-因为您有三个int可以返回X.GetHashCode()^Y.GetHashCode()^Z.GetHashCode()代码>是这样吗?我是否正确实现了比较器?我不这么认为,因为我有一个“if(!pointsInSurface.Contains(neights[I])”,我多次向这个pointsInSurface列表添加相同的点。我应该如何编写它?@Pedro:比较器应该是一个单独的类-您可能想实现IEQuatable
。@PedroDusso:您仍然需要实现GetHashCode()
-因为您有三个int可以返回X.GetHashCode()^Y.GetHashCode()^Z.GetHashCode()代码>为什么没有实现GetHashCode函数?这会覆盖基本的GetHashCode方法吗?它会干扰在集合中存储Point3D对象吗?为什么不实现GetHashCode函数?这会覆盖基本的GetHashCode方法吗?它会干扰在集合中存储Point3D对象吗?