c# - 使用 Except 的自定义对象未能使用 IEqualityComparer<T>

标签 c# linq iequalitycomparer iequatable

目标代码如下:

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

最佳答案

在您的示例中,您实际上并未向 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();
    }
}

关于c# - 使用 Except 的自定义对象未能使用 IEqualityComparer<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5437223/

相关文章:

c# - 在 C# 中捕获 Web 浏览器输出

c# - CloudBlob.DownloadText 方法插入附加字符?

javascript - 无循环迭代 IEnumerable 模型 - ASP.NET-MVC5

C# LINQ 查询 - 分组依据

C# - List<T>.Remove() 总是删除列表中的第一个对象

c# - 使用 IEqualityComparer 根据 C# 中的两个属性生成不同的列表

c# - 通过动态属性将两个通用列表相交

c# - C# 中 &= 和 |= 运算符的用途是什么

c# - 这可以通过单个 LINQ 查询实现吗?

c# - 改进两个集合之间的比较 - LINQ? C#