尝试使用 switch 语句而非 if else 来比较大小。

3

我是学习C#(和任何编程语言)的初学者 我正在尝试使用switch语句来替代if else

以下是工作中的if else语句:

  private void RunScript(int a, int b, ref object A)
  {
    if (a < b)
    {
      Print("a is smaller than b");
      Print("b is bigger than a");
    }
    else if (a > b)
    {
      Print("a is bigger than b");
      Print("b is smaller than a");
    }
    else
    {
      Print("a equals b");
    }

这是我正在尝试进行的开关操作。

 private void RunScript(double a, double b, ref object A)
      {
        double whichIsBigger = a - b;
//below is the 58th line
        switch (whichIsBigger)
        {
          case whichIsBigger < 0:
            Print("a is bigger than b");
            break;
          case whichIsBigger > 0:
            Print("a is smaller than b");
            break;
          default:
            Print("a equals b");
            break;
        }

它给了我这个错误 (CS0151): 一个开关表达式或情况标签必须是布尔、字符、字符串、整数、枚举或相应的可空类型 (第58行)
顺便说一下,我正在尝试在犀牛3D上使用犀牛公共库。
而且,我一直在努力寻找一个学习C#的网站或论坛,可以在那里提出这样的问题。我最终来到了这里。我认为这种问题非常基础,但我找不到一个可以解答这个问题的资源。我已经阅读了几篇帖子,也找不到类似的问题。
如果有任何可以像聊天室一样快速回答我的问题的网站,请告诉我。

2
Microsoft为C#提供了一些非常好的文档,特别是Switch语句。 :) - Jaskier
https://www.dotnetperls.com/ 是另一个为C#编程基础提供示例的绝佳资源。 - Sam W
3个回答

4
基本上,你正在尝试在你的case语句中运行一个评估。你必须在之前进行评估,并在你的case语句中使用这些值。
如果是一个真/假情况,你不应该使用switch。Switch通常用于有多个可能为真的选项的情况。例如,如果你有一个带有多个值的enum,并且你想为每个值执行不同的操作(如DayOfWeek.MondayDayOfWeek.Tuesday等),就像你在这里遇到的原因一样。
如果你真的想要,你可以创建一个ABCompare.BiggerABCompare.SmallerABCompare.Equal等枚举,然后在其上进行switch,但这并没有什么意义。

1
简而言之,Switch语句只适用于“相等”的情况,您不能随意添加任何条件。 - BradleyDotNET
@BradleyDotNET 你不能随意添加一个条件 你确定吗? - user4003407
@PetSerAl 当然可以在switch的参数中使用,但是case必须是常量。 - BradleyDotNET
那么,如果我这样写:case _ when randomCondition(): 它就不能工作了吗?@BradleyDotNET - user4003407
@PetSerAl 在C#7中允许一些模式匹配(注意when关键字!),我得承认我不够熟悉所有规则。但那可不是传统的switch :) - BradleyDotNET

1
< p > switch语句通过将传入的值与提供的备选项列表进行比较来工作。因此,您可以执行以下操作:

switch (a < b)
{
    case true:
        // do some stuff
        break;
    case false:
        switch (a > b)
        {
            case true:
                // do other stuff
                break;
            case false:
                // do other other stuff
                break;
        }
        break;
 }

但是在case语句中,您不能进行直接比较,因为它们已经使用传递到原始switch中的值进行了比较。
此外,上述示例不适合使用switch,因为使用if-else会更好。如果您的目标是了解switch,我的建议是尝试根据其值将enum转换为其他类型:
public enum Color
{
    Red,
    Blue,
    Green,
}

public string ConvertToHexWithIfElse(Color myColor)
{
    if (myColor == Color.Red)
    {
        return "#FF0000";
    }
    else if (myColor == Color.Green)
    {
        return "#00FF00";
    }
    else if (myColor == Color.Blue)
    {
        return "#0000FF";
    }

    return string.Empty;
}

public string ConvertToHexWithSwitch(Color myColor)
{
    switch (myColor)
    {
        case Color.Red:
            return "#FF0000";
        case Color.Blue:
            return "#0000FF";
        case Color.Green:
            return "#00FF00";
        default:
            return string.Empty;
    }
}

请注意,即使这个例子中使用了枚举,但这仍然是对switch的一种不太合适的使用方式,因为枚举只是被强制配置来展示用法。在我看来,switch并没有太多实际用处:你要么使用字典,要么使用if-else语句。

我的意思是...好吧,这回答了实际问题,但在实践中这样做是不推荐的。 - BradleyDotNET
@BradleyDotNET 发现了这一点,所以我加入了一个“正确”的使用方法。 - Woody1193
1
对于你最后的评论,“switch”在基于情况的实际逻辑时非常有用(而不仅仅是像你编造的例子中转换为值)。你总是可以用if/else替换,但那更冗长。字典可以用于逻辑情况,但语法很笨拙。 - BradleyDotNET
1
是的,状态机是一个经典的例子(尽管公平地说,对于那些情况,我通常使用状态模式更好)。 - BradleyDotNET
@BradleyDotNET 我也同意。 - Woody1193
显示剩余2条评论

1
在使用switch语句时,每个“case”中不应该有条件语句。Switch语句的设计目的是“切换”值。例如,交换颜色!
Color c = (Color) (new Random()).Next(0, 3);
switch (c)
{
    //Value of "c" is red
    case Color.Red:
       Console.WriteLine("Red!");
       break;
    //Value of "c" is green
    case Color.Green:
       Console.WriteLine("Green!");
       break;
    //Value of "c" is blue
    case Color.Blue:
       Console.WriteLine("Blue!");   
       break;
    //"c" is not red, green, or blue, so we default our message to say the color is unknown!
    default:
       Console.WriteLine("The color is not known.");
       break;   
}

在每个“case”中,我们检查“c”是否为特定值,如果不是,我们在switch语句中有一个默认选项来处理该场景。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接