c# - LINQ Distinct 未按预期工作

标签 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 初始化列表时结果如预期。所以在我看来好像StringComparison.InvariantCultureIgnoreCasePerson.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/

相关文章:

java - 使用编辑距离比较文件路径

c# - 如何区分一个 RabbitMQ 队列中的两个 JSON 对象?

c# - 如何收集对象列表中的单个属性?

c# - 如何处理 Rounding-off TimeSpan?

c# - 按日期降序获取被禁用户列表

c# - 如何在 .net 中获取对 Internet Explorer 窗口句柄的引用

c# - 为什么 case 语句不允许我设置将在方法内部使用的变量

c# - 如何解决 AddJsonOptions 不包含 SerializerSettings - .NET 的定义

vb.net - 如何在 LINQ 子查询中处理 Null?

c# - SequenceEqual 为真但 HashSet.SetEquals 为假