KeyValueComparer на основе ключа

У меня есть 2 ключа сравнения значений - в обоих я использую ключ для сравнения, который является строкой. Могу ли я использовать generic для значения - поэтому вместо 2 классов у меня может быть только 1?

Таким образом, вместо классов ниже я хотел бы иметь только 1 класс

class KvpComparer : IEqualityComparer < KeyValuePair < string, T>>
{
...
}

class KvpComparer : IEqualityComparer<KeyValuePair<string, Tuple<string, string>>>
{
    public bool Equals(KeyValuePair<string, Tuple<string, string>> x, KeyValuePair<string, Tuple<string, string>> y)
    {
        return x.Key.Equals(y.Key);
    }

    public int GetHashCode(KeyValuePair<string, Tuple<string, string>> obj)
    {
        return obj.Key.GetHashCode();
    }
}

class KvpComparer2 : IEqualityComparer<KeyValuePair<string, string>>
{
    public bool Equals(KeyValuePair<string, string> x, KeyValuePair<string, string> y)
    {
        return x.Key.Equals(y.Key);
    }

    public int GetHashCode(KeyValuePair<string, string> obj)
    {
        return obj.Key.GetHashCode();
    }
}

1 ответ

Решение

Поскольку компараторы отличаются только типом значения KeyValuePairВы можете использовать параметр типа для типа значения, чтобы обобщить два компаратора в один общий тип следующим образом.

class KvpComparer<T> : IEqualityComparer<KeyValuePair<string,T>> where T : class
{
    public bool Equals(KeyValuePair<string,T> x, KeyValuePair<string,T> y)
    {
        return x.Key.Equals(y.Key);
    }

    public int GetHashCode(KeyValuePair<string, T> obj)
    {
        return obj.Key.GetHashCode();
    }
}
Другие вопросы по тегам