执行这段代码最有效的方法是什么?

本文关键字:有效 方法 是什么 段代码 代码 执行 | 更新日期: 2023-09-27 18:17:00

老师要求我们以最有效的方式编写程序,并为此使用开关箱。

程序要求用户输入,根据用户输入的内容,程序必须遵循一组指令。

如果输入为"A"或"A",则数组必须从A到z排序。

如果输入为"Z"或"Z",则数组必须从Z到a排序。

如果输入是"R"或"R",则数组必须反转。

数组为字符串[]。

所以我想知道是否使用

更有效
switch (choice.ToLower())
{
    case "a":
        Array.Sort(array);
        break;
    case "z":
        Array.Sort(array);
        Array.Reverse(array);
        break;
    case "r":
        Array.Reverse(array);
        break;
}

 if (choice.ToLower() == "a" || choice.ToLower() == "z")
 {
     Array.Sort(array);
 }
 if (choice.ToLower() == "r" || choice.ToLower() == "z")
 {
     Array.Reverse(array);
 }

,也如果这段代码可以进一步优化。

那么,使用switch case或if结构最有效的方法是什么,并解释为什么?

我只是好奇,因为我总是试图优化我所有的代码到最大程度

执行这段代码最有效的方法是什么?

你可以自己查看:

class Program
{
    static void MyMethod1(int[] array, string choice)
    {            
        switch (choice.ToLower())
        {
            case "a":
                Array.Sort(array);
                break;
            case "z":
                Array.Sort(array);
                Array.Reverse(array);
                break;
            case "r":
                Array.Reverse(array);
                break;
        }
    }
    static void MyMethod2(int[] array, string choice)
    {            
        if (choice.ToLower() == "a" || choice.ToLower() == "z")
        {
            Array.Sort(array);
        }
        if (choice.ToLower() == "r" || choice.ToLower() == "z")
        {
            Array.Reverse(array);
        }
    }
    static int[][] CreateRandomArrays(int num, int length)
    {
        Random rand = new Random();
        int[][] arrays = new int[num][];
        for (int i = 0; i < arrays.Length; i++)
        {
            arrays[i] = new int[length];
            for (int i2 = 0; i2 < length; i2++)
                arrays[i][i2] = rand.Next();
        }
        return arrays;
    }
    static void Main(string[] args)
    {
        int[][] test1 = CreateRandomArrays(50, 200000);
        int[][] test2 = CreateRandomArrays(50, 200000);
        Stopwatch s = new Stopwatch();
        s.Start();
        for (int i = 0; i < test1.Length; i++) MyMethod1(test1[i], "z");
        s.Stop();
        Console.WriteLine(s.ElapsedMilliseconds);
        s.Restart();            
        for (int i = 0; i < test2.Length; i++) MyMethod2(test2[i], "z");
        s.Stop();
        Console.WriteLine(s.ElapsedMilliseconds);
    }
}

正如你所看到的,结果几乎相同:

1010 ms    vs    1008 ms

ToUpper更快+使用Linq,排序东西将不会执行,直到加入部分…

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static string[] words = {
        "what", "is", "the", "most", "effecient", "way", "to", "execute", "this", "code"
    };
    static void Main(string[] args)
    {
        IEnumerable<string> result;
        Console.Write("Choose words order (A to Z (A), Z to A (Z), Reversed (R)): ");
        switch (Console.ReadLine().ToUpper())
        {
            case "A": result = words.OrderBy(w => w); break;
            case "Z": result = words.OrderByDescending(w => w); break;
            case "R": result = words.Reverse(); break;
            default: result = words.AsEnumerable(); break;
        }
        Console.WriteLine(string.Join(" ", result));
    }
}

在您的例子中,它比较慢,因为它每次检查2个条件。看看这篇关于switchif速度的文章。(在您的示例中,if的4个条件总是被检查)。
如果switch包含超过5个元素,则使用查找表或哈希列表实现,这意味着所有项都获得相同的访问时间,而if列表则需要更多的时间才能到达最后一项,因为它必须首先评估每个先前的条件。