我正在编写自己的 LINQ 参考,但在一些更复杂的运算符实现方面遇到了麻烦。
有一个 Join 实现需要一个 IEqualityComparer 我快疯了。
在我写之前我试图先理解它(显然)
想象这两个列表:
List<string> initials = new List<string> {"A", "B", "C", "D", "E"};
List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"};
这里没有什么奇怪的。我想通过 Initial 加入这两个列表,例如:
初始=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 “ 也...
如果我输入“Ant”和“Ant”,它会同时添加。
简而言之,这样做的方法是什么?我知道我做错了什么。
谢谢你。