【发布时间】:2010-04-02 05:40:42
【问题描述】:
我正在编写自己的 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"};
这里没有什么奇怪的。我想通过首字母加入这两个列表,例如:
首字母=A Word=Ant
首字母=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();
}
}
Join 本身:
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”,它会同时添加。
简而言之,这样做的方法是什么?我知道我做错了什么。
谢谢。
【问题讨论】:
-
这不会回答您的问题,但您的 Equals 方法存在缺陷。在您当前的实现中,“Ants”将等于“Ant”,但“Ant”将不等于“Ants”。
-
不是一个答案,但它是一个很好的评论。很奇怪,你能再解释一下吗?你是对的。它添加了“蚂蚁”和“蚂蚁”。 “Ant”和“Ants”它添加了 Ants 并表示“Ant”和“Ants”是相同的。我不明白为什么。
-
StartsWith 如果实例完全以参数开始,而不仅仅是初始值,则返回 true。另一种说法是,如果参数完全包含在实例中并且位于实例的开头,则返回true。所以 "Ant".StartsWith("Ants") 是假的,因为 's' 在实例中不存在。
-
这就是我的解决方案。如果您将其作为答案,我会将其标记为有效。
标签: c# linq iequalitycomparer