我已经写了一些计时代码用于教学目的。一组代码使用冒泡排序(演示O(n ^ 2)复杂度),另一组使用快速排序(O(n log n))。函数签名不同;我的bubble sort接受一个int数组并返回一个int数组,而quicksort接受一个int数组并就地修改它——void return。所以这是我用来计时操作的代码:
private delegate int[] ArrayFunc(int[] arr);
private delegate void AlternateArrayFunc(int[] arr, int lbound, int ubound);
private static long TimeOperation(ArrayFunc functionToTest,int[] arrayToSort, int[] correctResult)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
int[] resultArray = functionToTest.Invoke(arrayToSort);
stopwatch.Stop();
Debug.Assert(resultArray.SequenceEqual(correctResult), "Arrays do not match");
return stopwatch.ElapsedTicks;
}
private static long TimeOperation(AlternateArrayFunc functionToTest, int[] arrayToSort, int[] correctResult)
{
var stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
functionToTest.Invoke(arrayToSort, 0, arrayToSort.Length - 1);
stopwatch.Stop();
Debug.Assert(arrayToSort.SequenceEqual(correctResult), "Arrays do not match");
return stopwatch.ElapsedTicks;
}
我只想要一个timeoperation函数,但是我不知道如何处理这两个不同的委托。我试着将第一个参数设为泛型,但我不能用委托来实现——或者至少我不知道如何实现。如果我把它做成普通的,它会在
.invoke
我真的不喜欢这样保存代码,因为唯一不同的是我正在计时的实际函数。
有什么建议可以让我在这种情况下遵循干燥原则吗?