林編寫我自己的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 「太...
如果我把」螞蟻「和」螞蟻「它添加兩個。
總之,做這種事情的方式是什麼?我知道我做錯了什麼。
謝謝。
這不會回答你的問題,但你的Equals方法是有缺陷的。在目前的實施中,「螞蟻」將等於「螞蟻」,但「螞蟻」不等於「螞蟻」。 – 2010-04-01 20:59:03
這不是一個答案,但它是一個很好的評論。它的奇怪,你能解釋一點嗎?你是對的。 「螞蟻」和「螞蟻」它增加了兩者。 「螞蟻」和「螞蟻」它增加螞蟻並且說「螞蟻」和「螞蟻」是相同的。我不明白爲什麼。 – 2010-04-01 21:04:54
如果實例以參數完全啓動,StartsWith將返回true,而不僅僅是初始值。另一種說法是,如果參數在實例中包含_completely_並且位於實例的開頭,則返回true。所以「螞蟻」.StartsWith(「螞蟻」)是錯誤的,因爲's'不存在於實例中。 – Crispy 2010-04-01 21:21:09