我有以下简单的类
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
初始化列表时结果如预期。所以在我看来好像StringComparison.InvariantCultureIgnoreCase
在Person.Equals
方法被忽略。
有人有想法吗?
最佳答案
此时需要让GetHashCode()
得到一个case-*in*sensitive Hash Code,大小写不同的hash code 姓名
。
例如:
public override int GetHashCode()
{
return Name.ToUpperInvariant().GetHashCode();
}
关于c# - LINQ Distinct 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11827956/