代码之家  ›  专栏  ›  技术社区  ›  Onorio Catenacci

如何消除这些函数中的冗余代码?

  •  0
  • Onorio Catenacci  · 技术社区  · 7 年前

    我已经写了一些计时代码用于教学目的。一组代码使用冒泡排序(演示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 我真的不喜欢这样保存代码,因为唯一不同的是我正在计时的实际函数。

    有什么建议可以让我在这种情况下遵循干燥原则吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   itsme86    7 年前

    您可以为快速排序创建一个与气泡排序方法具有相同签名的附加方法:

    public int[] QuickSortEntry(int[] arr)
    {
        QuickSort(arr, 0, arr.Length - 1);
        return arr;
    }
    

    或者你可以这样做:

    ArrayFunc qSort = arr => { QuickSort(arr, 0, arr.Length - 1); return arr; };
    

    …然后把它传给你的计时器方法。