我正在尝试为项目创建前缀文本值。我正在使用开关盒。当用户选择相关的单选按钮时,我们应该给出前缀值。
在“switch()”之后我应该给予什么
来自用户选择的值是布尔值。 输出是字符串。
任何帮助..
public string officePostfix()
{
string postfix = null;
switch (...)
{
case SheetMgrForm.Goldcoast = true:
postfix = "QLD";
break;
case SheetMgrForm.Melbourne = true:
postfix = "MEL";
break;
case SheetMgrForm.Sydney = true:
postfix = "SYD";
break;
case SheetMgrForm.Brisbane = true:
postfix = "BIS";
break;
}
return postfix;
}
答案 0 :(得分:5)
这不是switch
的工作方式。你不能在每个case
中放置一个任意的布尔表达式(假设你的意思是==
而不是=
,顺便说一句。)
您需要使用一组if-else
块,例如:
if (SheetMgrForm.Goldcoast) {
postfix = "QLD";
} else if (SheetMgrForm.Melbourne) {
postfix = "MEL";
} else if ......
然而,看起来您的设计可能会使用一些返工。拥有所有这些单独的布尔是笨拙的。
答案 1 :(得分:3)
另一种方法是使用枚举来定义您的区域,然后将这些区域映射到资源文件。这使得它更易于维护,例如未来的本地化或进一步扩展,如果列表很长,可能很有用,即通过T4自动创建枚举和资源,或者您必须查询Web服务,或者其他...
例如,假设您有AreaPostfixes
个资源文件和Area
枚举。
public enum Area
{
Goldcoast,
Melbourne,
// ...
}
public static class AreaExtensions
{
public static string Postfix(this Area area)
{
return AreaPostfixes.ResourceManager.GetString(area.ToString());
}
}
// AreaPostfixes.resx
Name Value
Goldcoast QLD
Melbourne MEL
// Usage
public string GetPostfix(Area area)
{
return area.Postfix();
}
这消除了对交换机等的任何需求,您唯一需要确保的是每个枚举和资源都有1:1的映射。我通过单元测试来做到这一点,但是如果GetIntring在Postfix扩展方法中返回null,则很容易放置Assert或抛出异常。
答案 2 :(得分:2)
switch
不支持此功能。案件必须是不变的。案件也必须是独一无二的。
您需要将布尔属性转换为enum
并关闭该属性或将您的开关更改为标准if
语句
http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.110).aspx
答案 3 :(得分:1)
您可以使用C#8中的属性模式来做到这一点:
string officePostfix(SheetMgrForm test) =>
test switch
{
{ GoldCoast: true } => "QLD",
{ Melbourne: true } => "VIC",
{ Sydney: true } => "NSW",
{ Brisbane: true } => "BIS",
_ => string.Empty
};
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#property-patterns
答案 4 :(得分:0)
这可能会返回您想要的结果,但这有点丑陋。案例部分期望某种恒定值。在这种情况下,您将具有“ case true:”或“ case false:”(尽管在这种情况下,我不确定您将如何处理)。
public string officePostfix()
{
string postfix = null;
switch (SheetMgrForm.Goldcoast == true)
{
case true:
postfix = "QLD";
break;
}
switch(SheetMgrForm.Melbourne == true)
{
case true:
postfix = "MEL";
break;
}
switch (SheetMgrForm.Sydney == true)
{
case true:
postfix = "SYD";
break;
}
switch(SheetMgrForm.Brisbane == true)
{
case true:
postfix = "BIS";
break;
}
return postfix;
}