मैं डबल्यू के अनुक्रमों के साथ LINQ के उपयोग को कम करने के लिए एक पुन: प्रयोज्य DoubleEqualityComparer (कस्टम सहिष्णुता: "ईपीएसलॉन" कन्स्ट्रक्टर पैरामीटर के साथ) लागू कर रहा हूं। उदाहरण के लिए:IEqualityComparer <double>; GetHashCode को कैसे कार्यान्वित करें?
bool myDoubleFound = doubles.Contains(myDouble, new DoubleEqualityComparer(epsilon: 0.01));
GetHashCode को लागू करने का सही तरीका क्या है?
public class DoubleEqualityComparer : IEqualityComparer<double>, IEqualityComparer<double?>
{
private readonly double epsilon;
public DoubleEqualityComparer(double epsilon)
{
if (epsilon < 0)
{
throw new ArgumentException("epsilon can't be negative", "epsilon");
}
this.epsilon = epsilon;
}
public bool Equals(double x, double y)
{
return System.Math.Abs(x - y) < this.epsilon;
}
public int GetHashCode(double obj)
{
// ?
}
}
पुनश्च:: मैं हमेशा समान मान कर सकते हैं:; हमेशा बराबर करने के लिए कॉल (डबल, डबल) विधि मजबूर करने के लिए (नहीं बहुत (पूर्व GetHashCode (डबल obj) {0 लौट}) कोड यह कलाकार, मुझे पता है), लेकिन मुझे याद है कि इस समाधान में समस्याएं होती हैं जब तुलनाकर्ता को शब्दकोश के साथ प्रयोग किया जाता है ...
आपको ऐसा नहीं करना चाहिए क्योंकि यह पारगमनशीलता का उल्लंघन करता है। यह संभव है कि 'बराबर बी' और 'बी बराबर सी 'लेकिन' सी बराबर नहीं है'। – Ani