与我班级的名单不同

Gle*_*leb 3 c# list

我有一节课:

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)

但没有任何反应.任何人都可以告诉我什么是错的?

Dmi*_*nko 8

覆盖时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.