मैं एक Dictionary<Tuple<>>
आवरण में इस की जरूरत है, तो मैं समानता के लिए और प्राप्त करने के लिए जाँच करने के लिए एक ही StringComparer का उपयोग करते हुए एक जेनेरिक वर्जन
public class TupleEqualityComparer<T1, T2> : IEqualityComparer<Tuple<T1, T2>>
{
private IEqualityComparer<T1> comparer1;
private IEqualityComparer<T2> comparer2;
public TupleEqualityComparer(IEqualityComparer<T1> comparer1, IEqualityComparer<T2> comparer2)
{
this.comparer1 = comparer1 ?? EqualityComparer<T1>.Default;
this.comparer2 = comparer2 ?? EqualityComparer<T2>.Default;
}
public bool Equals(Tuple<T1, T2> lhs, Tuple<T1, T2> rhs)
{
return comparer1.Equals(lhs.Item1, rhs.Item1) && comparer2.Equals(lhs.Item2, rhs.Item2);
}
public int GetHashCode(Tuple<T1, T2> tuple)
{
return comparer1.GetHashCode(tuple.Item1)^comparer2.GetHashCode(tuple.Item2);
}
}
public class Dictionary<TKey1, TKey2, TValue> : Dictionary<Tuple<TKey1, TKey2>, TValue>()
{
public Dictionary() : base() { }
public Dictionary(IEqualityComparer<TKey1> comparer1, IEqualityComparer<TKey2> comparer2) : base(new TupleEqualityComparer<TKey1, Tkey2>(comparer1, comparer2) { }
public TValue this[TKey1 key1, TKey2 key2]
{
get { return base[Tuple.Create(key1, key2)]; }
}
public void Add(TKey1 key1, TKey2 key2, TValue value)
{
base.Add(Tuple.Create(key1, key2), value);
}
public bool ContainsKey(TKey1 key1, TKey2 key2)
{
return base.ContainsKey(Tuple.Create(key1, key2));
}
public bool TryGetValue(TKey1 key1, TKey2 key2, out TValue value)
{
return base.TryGetValue(Tuple.Create(key1, key2), out value);
}
}
प्रयोग
var dict = new Dictionary<string, DateTime, int>(
StringComparer.OrdinalIgnoreCase, null);
dict.Add("value1", DateTime.Now, 123);
Assert.IsTrue(dict.ContainsKey("VALUe1"));
स्रोत
2017-08-29 10:05:02
बनाने के लिए @Jon के कोड का इस्तेमाल किया हैश कोड आमतौर पर आपके द्वारा उल्लेख की जाने वाली बग से बचने के लिए सबसे अच्छा काम करता है। मैंने एक प्रस्तावित फिक्स के साथ जवाब संपादित किया है; अगर आपको यह पसंद नहीं है तो कृपया पूर्ववत करें। – dtb
@ डीटीबी: निश्चित रूप से पूर्ववत नहीं किया जाएगा क्योंकि यह एक स्थिरता सुधार भी आईएमओ है। धन्यवाद! – Jon