是否可以创建单向IEqualityComparer?

时间:2019-04-08 12:01:28

标签: c# linq

重复编辑:不重复,因为问题中已经包含了响应中提供的所有信息。我想知道是否有人知道解决方法,或者至少知道预期的行为,而这个问题没有得到答案...

(跟进我最后的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);

但是,我发现有两个问题:

  1. 要实施IEqualityComparer<string>,我还需要实施GetHashCode()。我现在的假设是,哈希被认为比Equals更快,因此它首先检查HashCodes的相等性,并且只有在HashCodes相等时(=等于Equal才可能),它也使用Equals();来检查是否相等,因为成功的Hash不会。它也自动表示相等(毕竟可能发生冲突),我可以通过简单地使GetHashCode()返回相同的值来解决我的问题,而不管输入如何。
  2. 根据定义,IEqualityComparer(或者任何等价关系都必须是对称的:{​​{1}}。我使用a == b => b == a是因为IEqualityComparer需要它,但显然尝试编写单向GroupJoinIEqualityComparer并不暗示a == b,我还是假设b == a调用GroupJoin并带有元素第一个列表作为第一个参数,但是最好知道是否必须反转它:p

老实说,我正在尝试做一些事情,但这并不是我想做的,我可能应该使用一种不同的,更手动的,基于循环的方法,但我真的很感兴趣,想知道是否有人可以告诉我如何这些东西在内部起作用。

0 个答案:

没有答案