泛型方法超载分辨率

时间:2016-07-12 08:41:05

标签: c# generics

我已经阅读了很多关于C#泛型和方法重载但我似乎无法实现我想要的东西。 我想创建一个比较两个对象的方法,或两个具有给定delta的双精度(非常类似于Assert.AreEqual),但它也可以支持这些对象的集合,包括Dictionary和SortedList。

这是我的代码,但最后一个泛型重载似乎接管了更具体的重载:/ 有人能告诉我如何解决这个问题吗?

    private bool DeltaEquals<T>(IEnumerable<T> value1, IEnumerable<T> value2, double delta)
    {
        var iter1 = value1.GetEnumerator();
        var iter2 = value2.GetEnumerator();
        for (;;)
        {
            var next1 = iter1.MoveNext();
            var next2 = iter2.MoveNext();
            if (next1 != next2) return false;
            if (!next1) return true;
            if (!DeltaEquals(iter1.Current, iter2.Current, delta)) return false;
        }
    }

    private bool DeltaEquals<T, U>(KeyValuePair<T, U> value1, KeyValuePair<T, U> value2, double delta)
    {
        return DeltaEquals(value1.Key, value2.Key, delta) && DeltaEquals(value1.Value, value2.Value, delta);
    }

    private bool DeltaEquals(double value1, double value2, double delta)
    {
        return Math.Abs(value1 - value2) <= delta;
    }

    private bool DeltaEquals<T>(T value1, T value2, double delta)
    {
        return object.Equals(value1, value2);
    }

    // example of call:
    SortedList<DateTime, double> coll1, coll2;
    ...
    Assert.IsTrue(DeltaEquals(coll1, coll2, 1E-5));

0 个答案:

没有答案