从基于特性的列表中删除重复的对象
本文关键字:对象 删除 列表 于特性 | 更新日期: 2023-09-27 18:00:54
在SchematicElevation
对象列表中,如何使用LINQ删除具有相同属性的对象。
public class SchematicElevation
{
public double Elevation { get; set; }
public int ColumnId { get; set; }
}
var se1 = new SchematicElevation { ColumnId = 2, Elevation = 300 };
var se2 = new SchematicElevation { ColumnId = 3, Elevation = 300 };
var se3 = new SchematicElevation { ColumnId = 4, Elevation = 300 };
var se4 = new SchematicElevation { ColumnId = 4, Elevation = 300 };
var se5 = new SchematicElevation { ColumnId = 4, Elevation = 300 };
var SchematicElevations = new List<SchematicElevation> { se1, se2, se3, se4, se5}
最终结果如下所示:
List: {se1, se2, se3}
我希望使用LINQ和GroupBy来完成此操作。
您应该直接在SchematicElevation
上或通过IEqualityComparer<T>
实现相等。例如,使用Jon Skeet的哈希算法:
public class SchematicElevation : IEquatable<SchematicElevation>
{
public double Elevation { get; set; }
public int ColumnId { get; set; }
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
hash = hash * 23 + Elevation.GetHashCode();
hash = hash * 23 + ColumnId.GetHashCode();
return hash;
}
}
public override bool Equals(object other)
{
return Equals(other as SchematicElevation);
}
public bool Equals(SchematicElevation other)
{
return other != null && this.Elevation == other.Elevation &&
this.ColumnId == other.ColumnId;
}
}
然后,您只需执行Distinct()
即可获得不同的项目:
var schematicElevations = new List<SchematicElevation> {se1, se2, se3, se4, se5};
var distinct = schematicElevations.Distinct();
或者,你可以做一个GroupBy
。这使得代码更短,但与上面的不同,它不可重用或不易维护。例如,如果您想更改条件,则必须在使用该代码的任何地方更改该代码,而不仅仅是SchematicElevation
类。
var schematicElevations = new List<SchematicElevation> {se1, se2, se3, se4, se5};
var distinct = schematicElevations.GroupBy(x => new { x.ColumnId, x.Elevation })
.Select(g => g.First());
我强烈建议实现IEquatable。然后,你可以使用Distinct((方法,它是为做你想做的事情而设计的(而不是Group By,它不是为做你想要做的事情,但仍然允许你到达那里(。
var result = SchematicElevations.Distinct();