LINQ Distinct没有按预期工作

时间:2012-08-06 12:06:51

标签: c# .net linq distinct linq-to-objects

我有以下简单类

public class Person : IEquatable<Person>
{
    public bool Equals(Person other) 
    {
        return Name.Equals(other.Name, StringComparison.InvariantCultureIgnoreCase);
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }

    public Person(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

现在我正在创建一个人数组,在它们上调用distinct并传递默认的Equality Comparer,这是IEquatable<Person>实现的那个

var persons = new[] {new Person("foo"), new Person("Foo"), new Person("bar"), new Person("Bar")};
persons.Distinct(EqualityComparer<Person>.Default);

当我检查有区别的人时,我期待IEnumerable<Person>包含foo, bar。但是内容为foo, Foo, bar, Bar

当我使用foo, foo, bar, bar初始化List时,结果与预期一致。所以在我看来,StringComparison.InvariantCultureIgnoreCase方法中的Person.Equals被忽略了。

有人有想法吗?

2 个答案:

答案 0 :(得分:3)

此刻,您需要在 *敏感的哈希代码中GetHashCode()获取案例 - * ,它将是大写和小写Name的不同哈希码的。

例如:

public override int GetHashCode() 
{ 
    return Name.ToUpperInvariant().GetHashCode(); 
} 

答案 1 :(得分:2)

您的GetHashCode()将为应被视为相同的对象返回不同的哈希码。