如何在switch语句中比较文本框中的值?

问题描述 投票:1回答:2

我是C#的初学者,我正在尝试比较文本框中的值(应为N,S,E或W),然后使用switch语句根据以下内容确定包装的价格:区域输入到所述文本框中。

decimal N = 27;
decimal S = 36;
decimal E = 45;
decimal W = 54;
decimal ZoneCost = 0;

switch (textboxZone.Text)
{
    case N:
      ZoneCost = 27;
      break;

    case S:
      ZoneCost = 36;
      break;    

    etc.
}

我想发生的是根据输入的字母(或“区域”)更改ZoneCost变量。我不断收到错误消息,指出它无法将十进制隐式转换为字符串。

c# textbox switch-statement
2个回答
2
投票

使用新的C#8.0开关表达式的好地方:

int cost = textboxZone.Text switch {
    "N" => 27,
    "S" => 36,
    "E" => 45,
    "W" => 54,
    _ => throw new Exception("not valid input")
};

您的代码无法正常工作的原因是,您正在将字符串(textboxZone.Text)与十进制(变量N,S,E,W)进行比较。在您的switch子句周围加上双引号:

case "N":

0
投票

在更接近金属C样式风格的语言中,这种检查可能有效。如果您选择了正确的ASCII / Unicode值,那就是。

作为一般规则,字符串比较比较费力,后面也很痛苦。问题始于大小写,遍历空白,结束于标准化。就任何形式的处理而言,我能想到的唯一类型worse和字符串都是原始二进制。我避免了。即使我是将其编写到UI的人,我还是希望以另一种方式/另一种格式来获取输入。当使用用户或XML / Rest /类似服务时,这在本质上是邪恶的。

我将字母/数字对组织为称为PackageSize的结构,类或小节。创建PackageSize的列表数组。然后为UI提供一个ComboBox,并取消手动输入。填充数组中的CB,每个条目使用Letter进行显示,并使用ArrayIndex作为值。然后只关心所选的值,而不是显示要进行进一步处理的内容。 ComboBoxes可以通过这种方式为您提供一个很好的,可靠的Integer,可用于在其生成的集合中查找值。

如果您使用英文字母,那么进行字符串匹配的开关/外壳可以工作,并且现在可能足够容易且可靠得多。但是我避免给用户输入我无法处理的东西的选项。而且,一旦UI创建/输入匹配向下,值数组就更易于长期扩展。

© www.soinside.com 2019 - 2024. All rights reserved.