从另一个列表中删除一个列表的元素

时间:2011-12-05 20:24:08

标签: c# .net linq list

我有一个积分列表。我正在申请:

var result = neighbors.SelectMany(element => GenerateNeighbors(element)).Distinct<Point3D>().ToList<Point3D>();

从此列表的每个点生成所有邻居。但是我有另一个列表和其他点,这个邻居生成可以生成已添加到那个点的点。

如何从结果列表中删除其他列表中重复的元素?任何带有一些谓词的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;
        }
    }

1 个答案:

答案 0 :(得分:5)

您可以使用Linq Except()扩展方法:

result = result.Except(otherList).ToList();

您的Point3D课程应提供Equals / GetHashCode的适当实施(是的,您必须实施它,抛出NotImplementedException将无效)或实现(更明确)IEquatable<Point3D>,以实现此目的,或者您可以将自定义IEqualityComparer作为第二个参数传递给Except()