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();
}
}