从基于特性的列表中删除重复的对象

本文关键字:对象 删除 列表 于特性 | 更新日期: 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}

我希望使用LINQGroupBy来完成此操作。

从基于特性的列表中删除重复的对象

您应该直接在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();