【问题标题】:Filtering Duplicates In A List过滤列表中的重复项
【发布时间】:2013-11-28 22:12:40
【问题描述】:

我有一个想要过滤重复项目的列表。在问这个问题之前,我在 StackOverflow 上进行了搜索,找到了两个解决方案;使用.Distinct()HashSet,但是这些方法都不适合我。我试图过滤的对象实现了.Equals 方法,但它仍然不起作用。

我通过创建 500 个完全相同的对象并将它们放入列表中来测试这一点。我预计会留下 1 个,但所有 500 个仍然存在。我的对象是否需要实现其他方法才能使其工作?

谢谢。

【问题讨论】:

  • 你能分享一些代码来显示你的 equals 方法以及你是如何使用 Distinct 的
  • 关于 Tim Schmelter 的回答,您能否告诉我们该对象是否也覆盖了 GetHashCode?如果没有,您是否可以访问对象类的源代码?
  • 它没有覆盖它,但现在它覆盖了它并且它可以工作。谢谢。

标签: c# list hashset


【解决方案1】:

如果您覆盖Equals,则始终也覆盖GetHashCode

Why is it important to override GetHashCode when Equals method is overridden?

这里有一个简单的类来演示一个可能的实现。 GetHashCode 应该是高效的并且应该产生很少的冲突:

public class Foo
{
    public int ID { get; set; }
    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        Foo other = obj as Foo;
        if (other == null) return false;
        return this.ID == other.ID;
    }

    public override int GetHashCode()
    {
        return ID;
    }
}

Here's 如果您的相等性检查需要包含多个属性或集合,则另一种实现:

public override int GetHashCode()
{
    unchecked // Overflow is fine, just wrap
    {
        int hash = 17;
        // Suitable nullity checks etc, of course :)
        hash = hash * 23 + field1.GetHashCode();
        hash = hash * 23 + field2.GetHashCode();
        hash = hash * 23 + field3.GetHashCode();
        return hash;
    }
}

【讨论】:

  • 谢谢你,但我不明白你为什么要多次设置hash 的值。 hash = hash * 23 + field3.GetHashCode(); 不会覆盖所有其他行吗?不应该是+=吗?
  • @TheGateKeeper:那是hash = hash * 23 + ...,所以它不是覆盖它,而是采用旧的旧值并添加下一个哈希码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 2017-06-09
  • 2016-03-03
  • 2010-12-24
相关资源
最近更新 更多