我有一节课:
private class Part
{
public string Id { get; set; }
public string Class { get; set; }
public override bool Equals(object obj)
{
Part part = obj as Part;
return this.Id == part.Id;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我有一个这个类的列表,所以我需要在此列表中使用distinct.我就是做这个的:
List<Part> parts = new List<Part>();
//adding items
parts = parts.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)
但没有任何反应.任何人都可以告诉我什么是错的?
覆盖时Equals你也必须覆盖GetHashCode:
private class Part
{
public string Id { get; set; }
public string Class { get; set; }
// Whenever overiding Equals
// You have to override this method too
public override int GetHashCode() {
return String.IsNullOrEmpty(Id) ? 0 : Id.GetHashCode();
}
public override bool Equals(object obj)
{
Part part = obj as Part;
// if obj is not of Part you should return false
if (Object.ReferenceEquals(null, part))
return false;
return this.Id == part.Id;
}
}
Run Code Online (Sandbox Code Playgroud)
非常不当行为的原因是,Distinct 第一测试 GetHashCode和才 Equals.