我是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#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":
在更接近金属C样式风格的语言中,这种检查可能有效。如果您选择了正确的ASCII / Unicode值,那就是。
作为一般规则,字符串比较比较费力,后面也很痛苦。问题始于大小写,遍历空白,结束于标准化。就任何形式的处理而言,我能想到的唯一类型worse和字符串都是原始二进制。我避免了。即使我是将其编写到UI的人,我还是希望以另一种方式/另一种格式来获取输入。当使用用户或XML / Rest /类似服务时,这在本质上是邪恶的。
我将字母/数字对组织为称为PackageSize
的结构,类或小节。创建PackageSize
的列表数组。然后为UI提供一个ComboBox,并取消手动输入。填充数组中的CB,每个条目使用Letter进行显示,并使用ArrayIndex作为值。然后只关心所选的值,而不是显示要进行进一步处理的内容。 ComboBoxes可以通过这种方式为您提供一个很好的,可靠的Integer,可用于在其生成的集合中查找值。
如果您使用英文字母,那么进行字符串匹配的开关/外壳可以工作,并且现在可能足够容易且可靠得多。但是我避免给用户输入我无法处理的东西的选项。而且,一旦UI创建/输入匹配向下,值数组就更易于长期扩展。