C# 使用GroupBy从列表中删除重复对象<;T>;
我如何使用C# 使用GroupBy从列表中删除重复对象<;T>;,c#,list,group-by,C#,List,Group By,我如何使用GroupBy获得一个独特的点列表。我想消除重复点 List<_3DPoint> list_of_points = new List<_3DPoint> { ... }; public class _3DPoint { public double X { get; set; } public double Y { get; set; } public double Z { get; set; } } List-List-of-of-p
GroupBy
获得一个独特的点列表。我想消除重复点
List<_3DPoint> list_of_points = new List<_3DPoint> { ... };
public class _3DPoint
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
}
List-List-of-of-points=新列表{…};
公共类 3DPoint
{
公共双X{get;set;}
公共双Y{get;set;}
公共双Z{get;set;}
}
列出点的列表=新列表{…}
var noDuplicates=list_of_points.Distinct().ToList()
您可能希望覆盖Equals和GetHashCode,以便不仅删除列表中的重复引用,还删除Equal数据。list-list-of-of-points=new-list{…}
var noDuplicates=list_of_points.Distinct().ToList()
您可能想重写等值和GEHASHCODE,不仅删除列表中的重复引用,而且还等于数据。
< P>而不是<代码> GROPPB/<代码>,考虑执行<代码> IEQuabtI/<代码>,并使用<代码>枚举。public class ThreeDPoint : IEquatable<ThreeDPoint>
{
public bool Equals(ThreeDPoint other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return X.Equals(other.X) && Y.Equals(other.Y) && Z.Equals(other.Z);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ThreeDPoint) obj);
}
public override int GetHashCode()
{
unchecked
{
var hashCode = X.GetHashCode();
hashCode = (hashCode*397) ^ Y.GetHashCode();
hashCode = (hashCode*397) ^ Z.GetHashCode();
return hashCode;
}
}
public static bool operator ==(ThreeDPoint left, ThreeDPoint right)
{
return Equals(left, right);
}
public static bool operator !=(ThreeDPoint left, ThreeDPoint right)
{
return !Equals(left, right);
}
public ThreeDPoint(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public double X { get; private set; }
public double Y { get; private set; }
public double Z { get; private set; }
}
而不是<代码> GROPBY<代码>,考虑执行<代码> IEQuabtE//> >并使用<代码>枚举。
public class ThreeDPoint : IEquatable<ThreeDPoint>
{
public bool Equals(ThreeDPoint other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return X.Equals(other.X) && Y.Equals(other.Y) && Z.Equals(other.Z);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ThreeDPoint) obj);
}
public override int GetHashCode()
{
unchecked
{
var hashCode = X.GetHashCode();
hashCode = (hashCode*397) ^ Y.GetHashCode();
hashCode = (hashCode*397) ^ Z.GetHashCode();
return hashCode;
}
}
public static bool operator ==(ThreeDPoint left, ThreeDPoint right)
{
return Equals(left, right);
}
public static bool operator !=(ThreeDPoint left, ThreeDPoint right)
{
return !Equals(left, right);
}
public ThreeDPoint(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public double X { get; private set; }
public double Y { get; private set; }
public double Z { get; private set; }
}
谢谢你,约翰。你能解释一下你所说的相等数据是什么意思吗?如果有两个不同的3DPoint类实例具有相等的X、Y和Z值,那么我很确定这是一个副本。尤瓦尔在回答中用压倒一切的平等来掩盖这一点!谢谢你,约翰。你能解释一下你所说的相等数据是什么意思吗?如果有两个不同的3DPoint类实例具有相等的X、Y和Z值,那么我很确定这是一个副本。尤瓦尔在回答中用压倒一切的平等来掩盖这一点!谢谢你,尤瓦尔。那辆车还可以。但我想知道如何使用
GroupBy
实现这一点。谢谢Yuval,我不明白为什么使用GroupBy有时会给我留下重复的对象?GroupBy
只会根据传递的元素创建一个分组。然后,分组后,您必须只从组中选择第一个元素,因为这是您实际想要得到的,一个实例。因此,如果我使用第一个我不会有问题,对吗?可枚举。第一个选择第一个元素。如果没有元素,则抛出序列为空的invalidoOperationException
。但是,GroupBy
将确保组中至少有一个元素,因此您应该没事。谢谢Yuval。那辆车还可以。但我想知道如何使用GroupBy
实现这一点。谢谢Yuval,我不明白为什么使用GroupBy有时会给我留下重复的对象?GroupBy
只会根据传递的元素创建一个分组。然后,分组后,您必须只从组中选择第一个元素,因为这是您实际想要得到的,一个实例。因此,如果我使用第一个我不会有问题,对吗?可枚举。第一个选择第一个元素。如果没有元素,则抛出序列为空的invalidoOperationException
。但是,GroupBy
将确保组中至少有一个元素,因此您应该可以。为什么要使用GroupBy
?它的功能不是消除重复项。您可以按多个键列出_点的_。GroupBy(x=>new{x.x,x.Y,x.Z});,但这不会消除相同的点。这是正确的way@Vahid因为它确实以另一种方式工作,为什么你认为它应该工作将两个相同的项目分组将为您提供一组两个项目,这仅仅是因为您已将两个项目分组。为什么要使用groupby
?它的功能不是消除重复项。您可以按多个键列出_点的_。GroupBy(x=>new{x.x,x.Y,x.Z});,但这不会消除相同的点。这是正确的way@Vahid因为它确实以另一种方式工作,为什么你认为它应该工作将两个相同的项目分组将为您提供一个包含两个项目的组,这仅仅是因为您已将两个项目分组。
var list = new List<ThreeDPoint>
{
new ThreeDPoint(1.0, 2.0, 3.0),
new ThreeDPoint(1.0, 2.0, 3.0),
new ThreeDPoint(2.0, 2.0, 2.0),
new ThreeDPoint(2.0, 2.0, 2.0)
};
var distinctResult = list.GroupBy(x => new { x.X, x.Y, x.Z })
.Select(x => x.First());