C# 如何将方法名作为参数传递?

C# 如何将方法名作为参数传递?,c#,methods,refactoring,C#,Methods,Refactoring,我正在寻找一种缩短代码的方法。由于我的代码的很大一部分是可重复的,有没有办法将子方法名作为参数传递 这里有一个更大的部分可以让我的问题更加清楚: Random rnd = new Random(Guid.NewGuid().GetHashCode()); int[] ArrayRandom = new int[200000]; for (int j = 0; j < ArrayRandom.Length; j++) ArrayRandom[j] = rnd.

我正在寻找一种缩短代码的方法。由于我的代码的很大一部分是可重复的,有没有办法将子方法名作为参数传递

这里有一个更大的部分可以让我的问题更加清楚:

Random rnd = new Random(Guid.NewGuid().GetHashCode());
        int[] ArrayRandom = new int[200000];
        for (int j = 0; j < ArrayRandom.Length; j++) ArrayRandom[j] = rnd.Next(int.MaxValue);

        Console.WriteLine("\nInsertionSort\nARRAY SIZE:\t TIME [ms]:");
        for (int u = 50000; u <= 200000; u += 10000)
        {
            int[] TestArray = new int[u];
            Array.Copy(ArrayRandom, TestArray, u);
            double ElapsedSeconds;
            long ElapsedTime = 0, MinTime = long.MaxValue, MaxTime = long.MinValue, IterationElapsedTime;
            for (int n = 0; n < (NIter + 1 + 1); ++n)  
            {
                long StartingTime = Stopwatch.GetTimestamp();
                InsertionSort(TestArray);
                long EndingTime = Stopwatch.GetTimestamp();
                IterationElapsedTime = EndingTime - StartingTime;
                ElapsedTime += IterationElapsedTime;
                if (IterationElapsedTime < MinTime) MinTime = IterationElapsedTime;
                if (IterationElapsedTime > MaxTime) MaxTime = IterationElapsedTime;
            }
            ElapsedTime -= (MinTime + MaxTime);
            ElapsedSeconds = ElapsedTime * (1000.0 / (NIter * Stopwatch.Frequency));
            Console.WriteLine("{0,-12}\t{1}", u, ElapsedSeconds.ToString("F4"));
        }

        Console.WriteLine("\nSelectionSort\nARRAY SIZE:\t TIME [ms]:");
        for (int u = 50000; u <= 200000; u += 10000)
        {
            int[] TestArray = new int[u];
            Array.Copy(ArrayRandom, TestArray, u);

            double ElapsedSeconds;
            long ElapsedTime = 0, MinTime = long.MaxValue, MaxTime = long.MinValue, IterationElapsedTime;
            for (int n = 0; n < (NIter + 1 + 1); ++n)  
            {
                long StartingTime = Stopwatch.GetTimestamp();
                SelectionSort(TestArray);
                long EndingTime = Stopwatch.GetTimestamp();
                IterationElapsedTime = EndingTime - StartingTime;
                ElapsedTime += IterationElapsedTime;
                if (IterationElapsedTime < MinTime) MinTime = IterationElapsedTime;
                if (IterationElapsedTime > MaxTime) MaxTime = IterationElapsedTime;
            }
            ElapsedTime -= (MinTime + MaxTime);
            ElapsedSeconds = ElapsedTime * (1000.0 / (NIter * Stopwatch.Frequency));
            Console.WriteLine("{0,-12}\t{1}", u, ElapsedSeconds.ToString("F4"));
        }
        Console.WriteLine("\nCoctailSort\nARRAY SIZE:\t TIME [ms]:");
        for (int u = 50000; u <= 200000; u += 10000)
        {
            int[] TestArray = new int[u];
            Array.Copy(ArrayRandom, TestArray, u);

            double ElapsedSeconds;
            long ElapsedTime = 0, MinTime = long.MaxValue, MaxTime = long.MinValue, IterationElapsedTime;
            for (int n = 0; n < (NIter + 1 + 1); ++n)  
            {
                long StartingTime = Stopwatch.GetTimestamp();
                CocktailSort(TestArray);
                long EndingTime = Stopwatch.GetTimestamp();
                IterationElapsedTime = EndingTime - StartingTime;
                ElapsedTime += IterationElapsedTime;
                if (IterationElapsedTime < MinTime) MinTime = IterationElapsedTime;
                if (IterationElapsedTime > MaxTime) MaxTime = IterationElapsedTime;
            }
            ElapsedTime -= (MinTime + MaxTime);
            ElapsedSeconds = ElapsedTime * (1000.0 / (NIter * Stopwatch.Frequency));
            Console.WriteLine("{0,-12}\t{1}", u, ElapsedSeconds.ToString("F4"));
        }
        Console.WriteLine("\nHeapSort\nARRAY SIZE:\t TIME [ms]:");
        for (int u = 50000; u <= 200000; u += 10000)
        {
            int[] TestArray = new int[u];
            Array.Copy(ArrayRandom, TestArray, u);

            double ElapsedSeconds;
            long ElapsedTime = 0, MinTime = long.MaxValue, MaxTime = long.MinValue, IterationElapsedTime;
            for (int n = 0; n < (NIter + 1 + 1); ++n)  
            {
                long StartingTime = Stopwatch.GetTimestamp();
                HeapSort(TestArray);
                long EndingTime = Stopwatch.GetTimestamp();
                IterationElapsedTime = EndingTime - StartingTime;
                ElapsedTime += IterationElapsedTime;
                if (IterationElapsedTime < MinTime) MinTime = IterationElapsedTime;
                if (IterationElapsedTime > MaxTime) MaxTime = IterationElapsedTime;
            }
            ElapsedTime -= (MinTime + MaxTime);
            ElapsedSeconds = ElapsedTime * (1000.0 / (NIter * Stopwatch.Frequency));
            Console.WriteLine("{0,-12}\t{1}", u, ElapsedSeconds.ToString("F4"));
        }

如果您试图传入对排序方法的引用而不是硬编码,则可以让此方法接收指向排序方法的委托函数指针:

private static void TimeMySortAlgorithm(Action<int[]> sortMethod)
{
    for (int u = 50000; u <= 200000; u += 10000)
    {
        int[] TestArray = new int[u];

        // Rest of the code

        // Invoke the delegate.
        sortMethod(TestArray);

        // Rest of the code
    }
}
您可以按如下方式调用TimeMySortAlgorithm:

TimeMySortAlgorithm(InsertionSort);
TimeMySortAlgorithm(CocktailSort);
TimeMySortAlgorithm(HeapSort);

阅读更多信息。

将重复的代码重构为采用动作参数的方法

类似这样的未经测试:

void Main()
{
    Random rnd = new Random(Guid.NewGuid().GetHashCode());
    int[] ArrayRandom = new int[200000];
    for (int j = 0; j < ArrayRandom.Length; j++) ArrayRandom[j] = rnd.Next(int.MaxValue);

    performSort("Heap Sort", ArrayRandom, HeapSort);
    performSort("Cocktail Sort", ArrayRandom, HeapSort);
    performSort("Selection Sort", ArrayRandom, HeapSort);
    performSort("Insertion Sort", ArrayRandom, HeapSort);
}

public void performSort(string sortName, int[] arrayToSort, Action<int[]> sortFunction)
{
    int[] ArrayRandom = arrayToSort;

    Console.WriteLine("\n{0}\nARRAY SIZE:\t TIME [ms]:", sortName);
    for (int u = 50000; u <= 200000; u += 10000)
    {
        int[] TestArray = new int[u];
        Array.Copy(ArrayRandom, TestArray, u);
        double ElapsedSeconds;
        long ElapsedTime = 0, MinTime = long.MaxValue, MaxTime = long.MinValue, IterationElapsedTime;
        for (int n = 0; n < (NIter + 1 + 1); ++n)
        {
            long StartingTime = Stopwatch.GetTimestamp();
            sortFunction.Invoke(TestArray);
            long EndingTime = Stopwatch.GetTimestamp();
            IterationElapsedTime = EndingTime - StartingTime;
            ElapsedTime += IterationElapsedTime;
            if (IterationElapsedTime < MinTime) MinTime = IterationElapsedTime;
            if (IterationElapsedTime > MaxTime) MaxTime = IterationElapsedTime;
        }
        ElapsedTime -= (MinTime + MaxTime);
        ElapsedSeconds = ElapsedTime * (1000.0 / (NIter * Stopwatch.Frequency));
        Console.WriteLine("{0,-12}\t{1}", u, ElapsedSeconds.ToString("F4"));
    }
}

public void HeapSort(int[] array) { //Sorting code here }
public void CocktailSort(int[] array) { //Sorting code here }
public void InsertionSort(int[] array) { //Sorting code here }
public void SelectionSort(int[] array) { //Sorting code here }

为什么你不把重复部分放到另一个函数中,在这个函数中调用它呢?那么你想让我们深入到嵌套循环的墙中,为你重构它?您可能只需选择要在VS中重复的代码部分,右键单击,从上下文菜单中选择“重构”或“快速操作和重构”,然后选择“提取方法”。这正是我想要的,谢谢!
private static void InsertionSort(int[] array) { }
TimeMySortAlgorithm(InsertionSort);
TimeMySortAlgorithm(CocktailSort);
TimeMySortAlgorithm(HeapSort);
void Main()
{
    Random rnd = new Random(Guid.NewGuid().GetHashCode());
    int[] ArrayRandom = new int[200000];
    for (int j = 0; j < ArrayRandom.Length; j++) ArrayRandom[j] = rnd.Next(int.MaxValue);

    performSort("Heap Sort", ArrayRandom, HeapSort);
    performSort("Cocktail Sort", ArrayRandom, HeapSort);
    performSort("Selection Sort", ArrayRandom, HeapSort);
    performSort("Insertion Sort", ArrayRandom, HeapSort);
}

public void performSort(string sortName, int[] arrayToSort, Action<int[]> sortFunction)
{
    int[] ArrayRandom = arrayToSort;

    Console.WriteLine("\n{0}\nARRAY SIZE:\t TIME [ms]:", sortName);
    for (int u = 50000; u <= 200000; u += 10000)
    {
        int[] TestArray = new int[u];
        Array.Copy(ArrayRandom, TestArray, u);
        double ElapsedSeconds;
        long ElapsedTime = 0, MinTime = long.MaxValue, MaxTime = long.MinValue, IterationElapsedTime;
        for (int n = 0; n < (NIter + 1 + 1); ++n)
        {
            long StartingTime = Stopwatch.GetTimestamp();
            sortFunction.Invoke(TestArray);
            long EndingTime = Stopwatch.GetTimestamp();
            IterationElapsedTime = EndingTime - StartingTime;
            ElapsedTime += IterationElapsedTime;
            if (IterationElapsedTime < MinTime) MinTime = IterationElapsedTime;
            if (IterationElapsedTime > MaxTime) MaxTime = IterationElapsedTime;
        }
        ElapsedTime -= (MinTime + MaxTime);
        ElapsedSeconds = ElapsedTime * (1000.0 / (NIter * Stopwatch.Frequency));
        Console.WriteLine("{0,-12}\t{1}", u, ElapsedSeconds.ToString("F4"));
    }
}

public void HeapSort(int[] array) { //Sorting code here }
public void CocktailSort(int[] array) { //Sorting code here }
public void InsertionSort(int[] array) { //Sorting code here }
public void SelectionSort(int[] array) { //Sorting code here }