C# 如何最小化此开关?

C# 如何最小化此开关?,c#,switch-statement,C#,Switch Statement,如何最大限度地减少前三个工作类似的开关情况?if(2if(2如果您使用C#7,您可以使用模式匹配,尽管这是Jon Skeet正确指出的一种过度技巧。但是,如果您想坚持开关情况,并想减少“case”,您可以执行以下操作 switch(number){ case 2: a+=b; break; case 3: a+=b; break; case 4: a+=b; d=f; break; case 5: d=e; break; }

如何最大限度地减少前三个工作类似的开关情况?

if(2
if(2如果您使用C#7,您可以使用模式匹配,尽管这是Jon Skeet正确指出的一种过度技巧。但是,如果您想坚持开关情况,并想减少“case”,您可以执行以下操作

switch(number){
case 2:
    a+=b;
    break;
case 3:
    a+=b;
    break;
case 4:
    a+=b;
    d=f;
    break;
case 5:
    d=e;
    break;
}
if (2 <= number && number <= 4) {
  a += b;
}
if (number == 4) {
  d = f;
} else if (number == 5) {
  d = e;
}
您还可以使用以下变体替换第一种情况:

 switch(number)
   {
    case var _ when number == 2 || number==3 || number==4:
        a+=b;
        if(number ==4)
        d=f
     break;
    case 5:
        d=e;
        break;
    }

顺便说一句,如果您的问题是“a+b”大约是60行代码,那么您始终可以选择将其设置为函数(并将其移出开关盒),以提高其可读性

switch(number)
{
case 2:
case 3:
case 4:
    a+=b;
    if(number ==4)
        d=f;
    break;
case 5:
    d = e;
    break;
}
顺便说一句,一个60行的方法读起来从来都不有趣。如果你可以拆分,那就更好了。

如果你使用C#7,你可以利用模式匹配,即使这是Jon Skeet正确指出的一种过度技巧。但是如果你想坚持使用切换大小写,并想减少“大小写”,你可以做以下几件事

if (2 <= number && number <= 4) {
  a += b;
}
if (number == 4) {
  d = f;
} else if (number == 5) {
  d = e;
}
switch(number)
{
case 2:
case 3:
case 4:
    MethodAbAction();
    if(number ==4)
        MethodDFAction();
    break;
case 5:
    MethodDEAction();
    break;
}
您还可以使用以下变体替换第一种情况:

 switch(number)
   {
    case var _ when number == 2 || number==3 || number==4:
        a+=b;
        if(number ==4)
        d=f
     break;
    case 5:
        d=e;
        break;
    }

顺便说一句,如果您的问题是“a+b”大约是60行代码,那么您始终可以选择将其设置为函数(并将其移出开关盒),以提高其可读性

switch(number)
{
case 2:
case 3:
case 4:
    a+=b;
    if(number ==4)
        d=f;
    break;
case 5:
    d = e;
    break;
}


顺便说一句,一个60行的方法读起来从来都不有趣。如果你能分开就更好了。

你可以把
a+=b;
语句移到if语句外面,但我怀疑它会有多大的不同,为什么不保持原样呢?啊,因为“a+=b;”60行代码a+=b是60行代码吗?你不是把你的问题简单化了吗。你得到的答案可能只是a+=b而不是60行代码:)@NiranjanRai如果a+=b是60行代码。这行代码是否需要先执行,然后再执行d=f-案例4?如果是,提供的答案中的一个将大错特错。您可以将
a+=b;
语句移到外部的if语句,但我怀疑它会有多大区别,为什么不保持原样呢?啊,。因为“a+=b;”60行代码a+=b是60行代码吗?你不是把你的问题简单化了吗。你得到的答案可能只是a+=b而不是60行代码:)@NiranjanRai如果a+=b是60行代码。。是否需要先执行该行,然后执行d=f-情况4?如果答案是肯定的,那么其中一个答案就大错特错了。模式匹配在这里似乎有些过火——只使用
案例2:case 3:case 4:
会更简单。@jonsket当然,Jon,我同意。但既然他在OP中已经有了相同的案例,并希望减少相同的案例,我给出了一个选择。不,在最初的帖子中有三个独立的案例主体。我建议使用单个case body,只有三个case标签,不重复
a+=b@JonSkeet哦,当然。谢谢你的指点,我已经更新了答案。对我来说,这显然更简单。这里的模式匹配似乎有些过火了。只使用
case2:case3:case4:
会更简单。@jonsket当然,Jon,我同意。但既然他在OP中已经有了相同的案例,并希望减少相同的案例,我给出了一个选择。不,在最初的帖子中有三个独立的案例主体。我建议使用单个case body,只有三个case标签,不重复
a+=b@JonSkeet哦,当然。谢谢你的指出,我已经更新了答案,对我来说,这显然更简单。如果(number!=5){a+=b;}
@Zam,不,第一个语句可以简化。你假设
number
只包含2,3,4或5。但问题中没有说明
number
的实际值范围<代码>数字
很可能是0、1或任何其他数字。只有当
number
为2,3或4时,问题中的代码才会执行
a+=b
。这与
number!=5
…如果(number!=5){a+=b;}
@Zam,则第一个语句可以简化。您假设
number
只包含2,3,4或5。但问题中没有说明
number
的实际值范围<代码>数字
很可能是0、1或任何其他数字。只有当
number
为2,3或4时,问题中的代码才会执行
a+=b
。这与
number!=5
…不一定与问题中的代码相关。假设
number
中的数字只有2、3、4或5。但问题中没有任何东西支持你的假设。问题中的代码包括
number
可以是0、1或任何其他数字的情况,在这种情况下不应进行任何操作。但是,您在这里的回答与此不同,假设如果
number
是与
5
不同的任何数字,则
a+=b
应始终发生(注意问题中的代码是:仅当
number
为2、3或4时,才执行
a+=b
)@elgonzo我的答案是基于OP问题和他的代码样本而优化的。不,你的答案不是基于问题;您的回答基于您对问题的假设(正如我在第一条评论中已经解释的),该假设不一定与问题中的代码相关。假设
number
中的数字只有2、3、4或5。但问题中没有任何东西支持你的假设。问题中的代码包括
number
可以是0、1或任何其他数字的情况,在这种情况下不应进行任何操作。但是,您在这里的回答与此不同,假设如果
number
是与
5
不同的任何数字,则
a+=b
应始终发生(注意问题中的代码是:仅当
number
为2、3或4时,才执行
a+=b
)@elgonzo我的答案是基于OP问题和他的代码样本而优化的。不,你的答案不是基于问题;你的回答基于你对这个问题的假设(正如我在第一次评论中已经解释的)
switch(number)
{
case 2:
case 3:
case 4:
    MethodAbAction();
    if(number ==4)
        MethodDFAction();
    break;
case 5:
    MethodDEAction();
    break;
}