2010-02-26 72 views
0

考慮這個陣列的IEqualityComparer意思

 string[] presidents = { 
      "Adams", "Arthur", "Buchanan", "Bush", "Carter", "Cleveland", 
      "Clinton", "Coolidge", "Eisenhower", "Fillmore", "Ford", "Garfield", 
      "Grant", "Harding", "Harrison", "Hayes", "Hoover", "Jackson", 
      "Jefferson", "Johnson", "Kennedy", "Lincoln", "Madison", "McKinley", 
      "Monroe", "Nixon", "Pierce", "Polk", "Reagan", "Roosevelt", "Taft", 
      "Taylor", "Truman", "Tyler", "Van Buren", "Washington", "Wilson"}; 

我的分組標準是與長度爲1至5在一個組的名稱,在其它基團剩餘。
我實現這個使用這個派生類

class MyLengthComparer:IEqualityComparer<Int32> 
{ 
    public Int32 GetHashCode(Int32 i) 
    { 
     return i<=5?1:6; 
    } 


    public Boolean Equals(Int32 i1,Int32 i2) 
    { 
     if(i1<=5 && i2<=5) 
      return true; 
     if(i1>5 && i2>5) 
      return true; 
     else 
      return false; 
    } 
} 

現在我運行這個

 IEnumerable<IGrouping<Int32, String>> groupVar = presidents.GroupBy(prez=>prez.Length,new MyLengthComparer()); 
     foreach(IGrouping<Int32, String> grp in groupVar) 
     { 
      Console.WriteLine("******" + grp.Key + "******"); 
      foreach(String name in grp) 
       Console.WriteLine(name); 
     } 

     Console.ReadKey(); 

我想知道的IEqualityInterface.I的兩個函數的意思是說如何的比較實際上是被做。
什麼是關鍵的IGrouping意義,爲什麼它顯示5,6?

+1

您可以使用presidents.GroupBy(p =>(p.Length> 5))實現相同的分組。當然,這並不能回答你的問題,但這會使你無法編寫比較器。 – Jens 2010-02-26 07:29:23

回答

2

它示出圖5和6,因爲該組的鍵被認爲是從第一項創建的密鑰。 「亞當斯」長度爲5,「亞瑟」長度爲6,因此這些是該組的關鍵。

爲一組的關鍵是什麼組中的一切是爲了有共通之處。你的比較器在這方面很奇怪。

基本上,序列中的每個元件被投影到密鑰(名稱的長度),然後有一個查找,以找出鍵是否已經有一個基團。該查找需要散列碼(因爲它是基於散列的查找)並且相等 - 這就是您的自定義比較器提供的。它給取決於長度爲1或6的散列(實際數字是相對不重要的,他們是平等一致,這意味着查找將工作,他們是不同的,這意味着它會有效)。相等函數本身實際上只是「這兩個值在小於或等於5時都是相同的」。我可能會實現它:

public Boolean Equals(Int32 i1,Int32 i2) 
{ 
    return (i1 <= 5) == (i2 <= 5); 
} 

這實際上使得它更加明顯,你會得到相同的分組(使用不同的密鑰誠然)通過使用x => x.Name.Length <= 5關鍵投射,而不是提供自定義比較:

var groups = presidents.GroupBy(prez => prez.Length <= 5); 
foreach(var group in groups) 
{ 
    // This time the key will be true or false 
    Console.WriteLine("******" + group.Key + "******"); 
    foreach(String name in group) 
    { 
     Console.WriteLine(name); 
    } 
} 
+0

可否請你提供我一步步的code.I步驟行爲的意思是像亞當斯第一次掃描,它的關鍵是找到....類似的東西,或者它。我任何一個環節就是看不慣的比較是怎麼做的通過Equals和GetHashCode。 – 2010-02-26 07:29:32

+0

他已經給出了這樣一個很好的答案;)。 – Younes 2010-02-26 07:51:43

+0

@Akshay:我會從的IEqualityComparer分離出LINQ的一部分 - 你明白平等comparers開始嗎? – 2010-02-26 08:14:38