过滤列表中的重复项

The*_*per 3 c# list hashset

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

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

谢谢.

Tim*_*ter 8

如果覆盖Equals总是也覆盖 GetHashCode.

为什么在重写Equals方法时重写GetHashCode很重要?

这是一个简单的类来演示可能的实现.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的相等性检查需要包含多个属性或集合,那么这是另一个实现:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)