我的班级名单中有哪些不同之处?

3

我有一个类:

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;
    }
}

我有一个这个类的列表,所以我需要在这个列表上使用去重。这是我的做法:

List<Part> parts = new List<Part>();
//adding items
parts = parts.Distinct().ToList();

但是什么都没有发生。有人能告诉我出了什么问题吗?
2个回答

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;
    }
}

不良行为的原因在于 Distinct 先测试 哈希值 (GetHashCode),然后才测试 Equals


0

要在你的类上执行Distinct操作,你需要提供实现IEqualityComparer<T>的比较器。

例子:

public class SelectedItemComparer : IEqualityComparer<Part>
{

    public new bool Equals(Part x, Part y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Part source)
    {
        string code = source.Id.ToString();

        return code.GetHashCode();

    }
}

使用方法:

List<Part> parts = new List<Part>();
//adding items
parts = parts.Distinct(new SelectedItemComparer()).ToList();

参考资料:Distinctly LINQ – 获取不同的对象列表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接