此问题是此question
的附加内容在C#中,交换机案例无法通过其他情况,这会导致编译错误。在这种情况下,我只是在所选月份和之后的每个月的总月份中添加一些数字。 (简单的例子,并不意味着真实)
switch (month)
{
case 0:
add something to month totals
case 1:
add something to month totals
case 2:
add something to month totals
default:
break;
}
在C#中是否有合理的替代方法而不必写出大量的if语句?
if (month <= 0)
add something to month
if (month <= 1)
add something to month
if (month <= 2)
add something to month
.... etc
答案 0 :(得分:11)
通常,当您看到来自巨大的switch语句的噪音或许多可能属于多个块的if语句时,您试图抑制错误的设计。
相反,如果你实现规范模式以查看某些内容是否匹配,然后对其采取行动呢?
foreach(MonthSpecification spec in this.MonthSpecifications)
{
if(spec.IsSatisfiedBy(month))
spec.Perform(month);
}
然后您可以添加与您尝试的内容相匹配的不同规格。
很难说出你的域名是什么,所以我的例子可能有点人为。
答案 1 :(得分:8)
在C#转换语句中,只有在您想要通过的案例没有声明的情况下才可以通过案例
switch(myVar)
{
case 1:
case 2: // Case 1 or 2 get here
break;
}
但是如果你想要声明你必须使用可怕的GOTO
switch(myVar)
{
case 1: // Case 1 statement
goto case 2;
case 2: // Case 1 or 2 get here
break;
}
答案 2 :(得分:1)
答案 3 :(得分:1)
你在添加常量吗?如果是这样,也许这样的东西可以工作(C语法):
const int addToTotals[] = {123, 456, ..., 789};
for(i=month;i<12;i++)
totals += addToTotals[i];
如果你需要更复杂的语句而不是为每个月的总数添加常量,你可以对变量或函数指针做类似的事情。
- 亚当
答案 4 :(得分:0)
以相反的顺序写开关案例
case 2:
case 1:
case 0:
break;
default:
希望有所帮助!