重复编辑:不重复,因为问题中已经包含了响应中提供的所有信息。我想知道是否有人知道解决方法,或者至少知道预期的行为,而这个问题没有得到答案...
(跟进我最后的question问题)
我正在尝试使用.GroupJoin()将一个键列表映射到另一个键列表,但是如果忽略大写或某些转义序列后这些键相等,则这也是匹配项。
例如:
我的第一个列表中有一个名为"ABCD"
的钥匙。 “等于”列表可以包括:{"ABCD", "AbCd", "AB_MINUS_CD", "ab_PLUS_cd"}
。
我的自定义“等于”会检查转义序列的预定义列表:
等于:
public bool Equals(string firstKey, string escapedKey)
{
int counter = 0;
while (escapedKey.Count(x => x == '_') >= 2)
{
CharacterMaping mapping = Mappings.ElementAt(counter);
escapedKey = escapedKey.Replace(mapping, "");
}
return String.Equals(firstKey, escapedKey, StringComparison.CurrentCultureIgnoreCase);
}
GroupJoin:
IEnumerable<KeyMapping> keyMappings = cleanKeys.GroupJoin(
escapedKeys,
c => c,
e => e,
(c, result) => new KeyMapping(c, result),
_keyComparer);
但是,我发现有两个问题:
IEqualityComparer<string>
,我还需要实施GetHashCode()
。我现在的假设是,哈希被认为比Equals更快,因此它首先检查HashCodes的相等性,并且只有在HashCodes相等时(=等于Equal才可能),它也使用Equals();
来检查是否相等,因为成功的Hash不会。它也自动表示相等(毕竟可能发生冲突),我可以通过简单地使GetHashCode()
返回相同的值来解决我的问题,而不管输入如何。 IEqualityComparer
(或者任何等价关系都必须是对称的:{{1}}。我使用a == b => b == a
是因为IEqualityComparer
需要它,但显然尝试编写单向GroupJoin
:IEqualityComparer
并不暗示a == b
,我还是假设b == a
调用GroupJoin
并带有元素第一个列表作为第一个参数,但是最好知道是否必须反转它:p 老实说,我正在尝试做一些事情,但这并不是我想做的,我可能应该使用一种不同的,更手动的,基于循环的方法,但我真的很感兴趣,想知道是否有人可以告诉我如何这些东西在内部起作用。