Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从其他列表中删除一个列表的元素_C#_.net_Linq_List - Fatal编程技术网

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对象吗?