>假设你有一个像这样的MyObject列表:
public class MyObject
{
public int ObjectID {get;set;}
public string Prop1 {get;set;}
}
如何从列表中删除重复项,其中可能存在具有相同 ObjectID 的多个对象实例。
谢谢。
您可以使用
GroupBy()
并选择每个组的第一项来实现您想要的目标 - 假设您要为每个不同的ObjectId
属性选择一个项目:
var distinctList = myList.GroupBy(x => x.ObjectID)
.Select(g => g.First())
.ToList();
或者,MoreLinq 项目中也有DistinctBy()
,它允许使用更简洁的语法(但会为您的项目添加依赖项):
var distinctList = myList.DistinctBy( x => x.ObjectID).ToList();
您可以使用
Distinct()
方法执行此操作。但由于该方法使用默认相等比较器,因此您的类需要实现如下IEquatable<MyObject>
:
public class MyObject : IEquatable<MyObject>
{
public int ObjectID {get;set;}
public string Prop1 {get;set;}
public bool Equals(MyObject other)
{
if (other == null) return false;
else return this.ObjectID.Equals(other.ObjectID);
}
public override int GetHashCode()
{
return this.ObjectID.GetHashCode();
}
}
现在您可以使用Distinct()
方法:
List<MyObject> myList = new List<MyObject>();
myList.Add(new MyObject { ObjectID = 1, Prop1 = "Something" });
myList.Add(new MyObject { ObjectID = 2, Prop1 = "Another thing" });
myList.Add(new MyObject { ObjectID = 3, Prop1 = "Yet another thing" });
myList.Add(new MyObject { ObjectID = 1, Prop1 = "Something" });
var duplicatesRemoved = myList.Distinct().ToList();
您可以通过实现 IEqualityComparer 接口来创建自定义对象比较器:
public class MyObject
{
public int Number { get; set; }
}
public class MyObjectComparer : IEqualityComparer<MyObject>
{
public bool Equals(MyObject x, MyObject y)
{
return x.Id == y.Id;
}
public int GetHashCode(MyObject obj)
{
return obj.Id.GetHashCode();
}
}
然后简单地:
myList.Distinct(new MyObjectComparer())