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

How to compare values from textbox in a switch statement?

我是 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.
}

我想要发生的是根据输入的字母(或 "zone")更改 ZoneCost 变量。 我一直收到一条错误消息,说它无法将小数隐式转换为字符串。

使用新的 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":

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

一般来说,字符串比较很挑剔,而且很麻烦。问题从大小写开始,越过空格并围绕规范化结束。就任何形式的处理而言,我能想到的唯一类型 worse then string 是原始二进制。我避免它。即使我是将它写入 UI 的人,我也更喜欢让输入另一种 way/another 格式。当与用户或 XML/Rest/similar 服务一起工作时,这是一个 essesarily 邪恶。

我会将 Letter/Number 对组织成一个结构,class 或名为 PackageSize 的元组。创建 PackageSize 列表的数组。然后给 UI 一个禁用手动输入的 ComboBox。从数组中填充 CB,每个条目使用 Letter 进行显示,ArrayIndex 作为值。然后只关心选择的值,而不关心显示的内容以供进一步处理。 ComboBoxes 可以通过这种方式为您提供一个漂亮的实心整数,可用于在构建它的集合中查找值。

A​​ switch/case 进行字符串匹配可以工作,并且如果您坚持使用英文字母,现在可能更容易并且足够可靠。但我避免让用户选择输入我无法处理的东西。而且一旦你得到 UI creation/input 匹配,值数组更容易长期扩展。