我已经阅读了很多关于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));