gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:26:25 26 4
gpt4 key购买 nike

目标代码如下:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com