使用Except创建自定义对象时无法使用IEqualityComparer<T>。

5

这里是目标代码:

public class DlpItem : IEqualityComparer<DlpItem>
{   
    public string Text { get; set; }
    public int Id { get; set; }

    public DlpItem(int pId)
    {
        Text = string.Empty;
        Id = pId;
    }

    public override bool Equals(object obj)
    {
        return Id == (obj as DlpItem).Id;
    }

    public bool Equals(DlpItem a, DlpItem b)
    {
        return a.Id == b.Id;
    }

    public int GetHashCode(DlpItem item)
    {
        return Id.GetHashCode();
    }
}

我有两个列表如下:

var list1 = new List<DlpItem>();
list1.Add(new DlpItem(1));
list1.Add(new DlpItem(2));


var list2 = new List<DlpItem>();
list2.Add(new DlpItem(1));
list2.Add(new DlpItem(2));

var delItems = list1.Except(list2).ToList<DlpItem>();

delItems始终包含两个项目。我在这里缺少什么?

编辑:代码现在实现了IEquatable

public class DlpItem : IEqualityComparer<DlpItem>, IEquatable<DlpItem>
{   
    public string Text { get; set; }
    public int Id { get; set; }


    public override bool Equals(object obj)
    {
        return Id - (obj as DlpItem).Id == 0;
    }

    public bool Equals(DlpItem a, DlpItem b)
    {
        return a.Id == b.Id;
    }

    public bool Equals(DlpItem item)
    {
        return item != null && Id == item.Id;
    }

    public int GetHashCode(DlpItem item)
    {
        return Id.GetHashCode();
    }
}
1个回答

4
在你的例子中,实际上并没有向list2添加任何内容...这是一个非常简单的错误,但还有一个更重要的问题:
需要使用IEquatable<T>而不是IEqualityComparer<T>;此外,您可能希望确保哈希码不能更改;最简单的方法是使Id只读:
public class DlpItem : IEquatable<DlpItem>
{
    public string Text { get; set; }
    private readonly int id;
    public int Id { get { return id; } }

    public DlpItem(int id)
    {
        Text = "";
        this.id = id;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as DlpItem);
    }

    public bool Equals(DlpItem other)
    {
        return other != null && this.Id == other.Id;
    }
    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

我也按照MSDN指示尝试使用了这个接口,结果还是一样的。我还纠正了我的示例中的拼写错误。 - Matthew Cox
我也尝试着重新添加,假设可能是我犯了一个错误,但仍然不好。 我会发布代码。 - Matthew Cox
我没有覆盖GetHashCode()方法...我只是有一个公共的int GetHashCode()方法...因此它失败了。微小的更正,但看了MSDN然后回到你的例子帮助我发现了问题! - Matthew Cox

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