2010-04-01 46 views
1

林編寫我自己的LINQ參考,但我遇到一些更復雜的操作符實施麻煩。加入+ IEqualityComparer <T>和HashCode

有一個加入實現需要IEqualityComparer Im變得瘋狂。

我試着先了解它之前,我寫的(顯然)

圖片這兩份名單:

List<string> initials = new List<string> {"A", "B", "C", "D", "E"}; 

List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"}; 

沒有什麼奇怪的在這裏。我想初始,像加入兩份名單:

初始= A字=螞蟻
初始= A字=弧
初始= B字=船
...

我需要一個比較,我寫了這個:

public class InitialComparator : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.StartsWith(y); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj[0].GetHashCode(); 
    } 
} 

的加入本身:

var blah = initials.Join(words, 
            initial => initial, 
            word => word, 
            (initial, word) => 
            new {Initial = initial, Word = word}, 
            new InitialComparator()); 

這是我第一次使用HashCodes,經過很好的調試會話之後,我發現每個單詞都會去比較器並查看它的HashCode,如果另一個單詞具有相同的HashCode,它就會調用equals。

因爲我想比較剛剛起步,雖然我認爲我需要的只是第一個字母哈希(難道我錯了嗎?)

的事情是,這是不正常工作。它說「Ant」和「Arc」是等價的,好吧,它會比較同一個列表中的每個單詞,但它只添加它找到的最後一個單詞,在這種情況下,Arc,忽略Ant和Ant等於「A 「太...

如果我把」螞蟻「和」螞蟻「它添加兩個。

總之,做這種事情的方式是什麼?我知道我做錯了什麼。

謝謝。

+1

這不會回答你的問題,但你的Equals方法是有缺陷的。在目前的實施中,「螞蟻」將等於「螞蟻」,但「螞蟻」不等於「螞蟻」。 – 2010-04-01 20:59:03

+0

這不是一個答案,但它是一個很好的評論。它的奇怪,你能解釋一點嗎?你是對的。 「螞蟻」和「螞蟻」它增加了兩者。 「螞蟻」和「螞蟻」它增加螞蟻並且說「螞蟻」和「螞蟻」是相同的。我不明白爲什麼。 – 2010-04-01 21:04:54

+1

如果實例以參數完全啓動,StartsWith將返回true,而不僅僅是初始值。另一種說法是,如果參數在實例中包含_completely_並且位於實例的開頭,則返回true。所以「螞蟻」.StartsWith(「螞蟻」)是錯誤的,因爲's'不存在於實例中。 – Crispy 2010-04-01 21:21:09

回答

0

脆皮提到嘗試 X [0] == Y [0]的 代替 x.StartsWith(Y); 這對我有效。

0

我不知道爲什麼你看到這種行爲,但我認爲用「的SelectMany」將是一個更簡單的方法和(更重要的),有你想要的行爲:我更喜歡

var blah = 
    from word in words 
    from initial in initials 
    where (word.StartsWith(initial)) 
    select new { Initial = initial, Word = word }; 

在可能的情況下使用理解語法。當理解查詢中有多個「from」子句時,將調用「SelectMany」。

+0

是的,但正如我所說的即時寫西班牙語LINQ運營商的參考。我現在用Join運算符,我需要一個帶有IEqualityComparer的Join的例子。簡單的事情,如果可能的話,不需要更多的操作符。我想了一些不是很愚蠢的東西。我以這件事結束,因爲它很簡單,但我無法得到它的工作。 – 2010-04-01 21:17:23

2

你實際上並不需要自己的相等比較,剛剛加入對像這樣的個別字母:

var mine = from i in initials 
    join w in words on i[0] equals w[0] 
    select new { 
      Initial = i, 
      Words = w 
    };
+0

我必須使用比較器... – 2010-04-01 21:24:28

+0

然後我想你可以修復你的Equals方法,但是我很好奇你爲什麼必須使用自定義比較器。 ' public bool Equals(string x,string y){ \t return x [0] == y [0]; } ' – Crispy 2010-04-01 21:38:48

+0

我說了兩遍..我寫了所有實現的所有操作符的引用,其中之一是Join +比較器。問題只是等於方法。 – 2010-04-01 21:43:24

相關問題