【问题标题】:Trying to use switch statement insted of if else to find out which value is bigger or smaller尝试使用 switch 语句而不是 if else 来找出哪个值更大或更小
【发布时间】:2018-11-20 17:55:37
【问题描述】:

我是学习 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):switch 表达式或 case 标签必须是 bool、char、string、integral、enum 或相应的可为 null 类型(第 58 行)

仅供参考,我正在尝试在 rhinoceros3d 上使用 rhino 通用库来执行此操作。

而且,我一直在尝试寻找一个网站或论坛来学习 C#,我可以 问这样的问题。我最终来到了这里。 我认为这类问题很基础,但我找不到 资源,可以给我这个问题的答案。 看了几篇帖子,没找到类似的问题

如果有任何网站可以让人们快速回答我的问题,比如聊天室之类的, 请务必告诉我。

【问题讨论】:

标签: c# if-statement switch-statement


【解决方案1】:

基本上,您正在尝试在 case 语句中运行评估。您必须先进行评估,并使用 case 语句中的值。

如果是true / false 情况,则不应使用 switch。切换通常用于当有许多选项可能为真时。例如,如果您有一个具有多个值的 enum,并且您想对每个值执行不同的操作(例如 DayOfWeek.MondayDayOfWeek.Tuesday 等)。出于您遇到这里的确切原因。

如果你真的想要,你可以创建一个 ABCompare.BiggerABCompare.SmallerABCompare.Equal 或类似的枚举,然后在上面创建一个 switch -- 但这并没有什么意义。

【讨论】:

  • TL;DR Switch 语句仅适用于 equality,您不能只在其中抛出随机条件。
  • @BradleyDotNET 你不能随便乱扔一个条件你确定吗?
  • @PetSerAl 当然可以在switch 的参数中,但大小写必须是常量。
  • 那么,如果我这样写:case _ when randomCondition(): 它不会工作吗? @BradleyDotNET
  • @PetSerAl 在 C#7 中允许使用一些模式匹配(请注意 when 关键字!),我承认我不够熟悉,无法了解所有规则。这不是传统的switch :)
【解决方案2】:

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;
    }
}

请注意,即使是 this 示例也有点不恰当地使用 switch,因为枚举是一种强制设计,仅用于显示用法。恕我直言,开关没有太多实际用途:您要么使用字典,要么使用 if-else。

【讨论】:

  • 我的意思是......好吧,这回答了实际问题,但不建议在实践中这样做。
  • @BradleyDotNET 意识到这一点,所以我添加了一个正确使用它
  • 对于您的最后一条评论,switch 在您有一些基于案例的实际逻辑时非常有用(而不是像您设计的示例中那样仅转换为值)。您可以总是 用 if/else 替换,但这更冗长。字典,可以用于逻辑案例,但语法很尴尬。
  • @BradleyDotNET 同意。如果有函数转换,那么就使用它,如果有类型一致性并且没有逻辑,那么字典会更好,如果情况很少,那么 if-else 会更有意义。唯一一次我发现我需要一个 switch case 是在处理类似于“我在这三种情况下需要一个值,但对于其他四种情况我需要进行方法调用”或类似的对象时。想想状态机或自动机
  • 是的,状态机是一个经典的例子(但公平地说,状态模式通常更好地服务于那些)
【解决方案3】:

在执行 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;   
}

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

【讨论】:

    猜你喜欢
    • 2012-06-02
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多