Tôi đang triển khai DoubleEqualityComparer có thể tái sử dụng (với dung sai tùy chỉnh: tham số hàm tạo "epsilon") để giảm bớt việc sử dụng LINQ với các chuỗi kép. Ví dụ:IEqualityComparer <double> với dung sai; làm thế nào để thực hiện GetHashCode?
bool myDoubleFound = doubles.Contains(myDouble, new DoubleEqualityComparer(epsilon: 0.01));
Cách thích hợp để triển khai GetHashCode là gì? Dưới đây là các mã:
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)
{
// ?
}
}
PS: Tôi luôn có thể trả về giá trị tương tự (ví dụ: GetHashCode (double obj) {return 0;}) để luôn luôn buộc các cuộc gọi đến Equals phương pháp (double, double) (không phải là rất biểu diễn, tôi biết), nhưng tôi nhớ rằng giải pháp này gây ra vấn đề khi so sánh được sử dụng với từ điển ...
Bạn không nên làm điều này vì nó vi phạm sự chuyển đổi. Có thể là 'a bằng b' và' b bằng c' nhưng 'a không bằng c'. – Ani