2016-11-16 4 views
1

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

Так вместо классов ниже, я хотел бы только 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(); 
    } 
} 

ответ

3

Как компараторы отличаются только типом ценностной 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(); 
    } 
} 
+0

Большое вам спасибо, Codor! – Anand

Смежные вопросы