过滤列表中的重复项

时间:2013-11-15 13:41:15

标签: c# list hashset

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

我通过创建500个完全相同的对象并将它们放在列表中来测试它。我预计会有1人离开,但所有500人仍在那里。我的对象是否需要实现其他方法才能生效?

感谢。

1 个答案:

答案 0 :(得分:8)

如果您覆盖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;
    }
}