泛型属性的浮点比较

本文关键字:比较 属性 泛型 | 更新日期: 2023-09-27 18:37:21

我有一个具有一些属性的泛型类:

class MyClass<TValueType>
    where TValueType : struct, IComparable
{        
    public TValueType Target
    {
        get { return _target; }
        set
        {
            if (Equals(_target, value)) return;
            _target = value;
            RaiseTargetChanged(value);
        }
    }
    // Other stuff ...
}

如您所见,我与object.Equals进行比较以避免过多的事件调用。但是,我有一个用于浮点比较的扩展方法,如果TValueType是双精度、浮点数或十进制,我想使用:

public static bool AlmostEqual(this double x, double y, double delta = 0.00001d)
public static bool AlmostEqual(this float x, float y, float delta = 0.00001f)
public static bool AlmostEqual(this decimal x, decimal y, decimal delta = 0.00001m)

我应该键入比较并转换 TValueType 并进行适当的浮点比较,还是有更聪明的方法?

编辑:David Heffernan的解决方案:

我已强制要求将比较器传递给类:

class MyClass<TValueType>
{
    public MyClass(IComparer<TValueType> comparer) { ... }
}

然后我传递一个自定义比较器:

public class FloatingPointComparer : IComparer<double>, IComparer<float>, IComparer<decimal>, IComparer
{
    public int Compare(double x, double y)
    {
        return FloatingComparisonExtensions.CompareTo(x, y);
    }
    // Rest of Compares are the same
} 

我使用的是IComparer而不是IEqualityComparer,因为我需要根据最大值和最小值验证 Target。

泛型属性的浮点比较

与其在

泛型类中使用类型检查代码(这感觉有些脏),不如要求使用者提供一个IEqualityComparer<TValueType>接口来执行比较。如果使用者不提供,则代码将默认为 Object.Equals