2012-08-06 76 views
3

我有以下簡單的類LINQ鮮明的工作不正常

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; } 
} 

現在我創造者的數組,呼籲他們不同,並通過默認的相等比較,這是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被忽略。

有沒有人有想法?

+0

其他一些言論(你的問題已經被解決的答案)。你應該考慮在'Equals'中檢查'other'的'other'。由於'Person'可能來自(它不是''sealed'類),因此還可以考慮說'if(GetType()!= other.GetType()){return false; }'。請注意,您的對象是可變的(在構造對象後'Name'可以更改),並且可變對象包含在字典或散列集中時不應該發生變異。通過saynig'return obj as Person;'覆蓋虛擬Object.Equals(object obj)'。 – 2012-08-06 21:28:36

回答

3

你需要讓GetHashCode()在此刻得到了區分* *敏感哈希碼,這將是大寫和小寫Name的不同的哈希碼。

例如:

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

'ToUpperInvariant()'比'ToLower()'更高效。 – 2012-08-06 12:12:02

+0

@ m-y謝謝,我只是從記憶裏出來,我知道會有更好的方法。 – DaveShaw 2012-08-06 15:02:11

2

您的GetHashCode()將返回不同的哈希碼,以應該被視爲相同的對象。