是否可以在C#
中为Switch语句添加一个额外的条件switch(MyEnum)
{
case 1:
case 2:
case 3 && Year > 2012://Additional Condtion Here
//Do Something here..........
break;
case 4:
case 5:
//Do Something here..........
break;
}
在上面提到的示例中,如果 MyEnum = 3 ,那么如果年份>则必须执行此操作。 2012 ......有可能吗?
[EDITED]
年份> 2012年不适用于案例1和案例1案例2。
答案 0 :(得分:8)
为了让它按照你用1和2的穿透逻辑指示的方式工作,我建议将//do something here
部分移出到方法或函数然后执行此操作:
case 1:
case 2:
DoSomething(); break;
case 3:
if(Year > 2012) { DoSomething(); }
break;
另一种选择是:
case 1:
case 2:
case 3:
if (MyEnum != 3 || Year > 2012) {
// Do something here
}
break;
但我认为第一个选项更直观,更易读。
答案 1 :(得分:8)
C#7新功能:
...的情况下,当
https://docs.microsoft.com/hu-hu/dotnet/articles/csharp/whats-new/csharp-7
public static int DiceSum4(IEnumerable<object> values)
{
var sum = 0;
foreach (var item in values)
{
switch (item)
{
case 0:
break;
case int val:
sum += val;
break;
case IEnumerable<object> subList when subList.Any():
sum += DiceSum4(subList);
break;
case IEnumerable<object> subList:
break;
case null:
break;
default:
throw new InvalidOperationException("unknown item type");
}
}
return sum;
}
答案 2 :(得分:4)
答案是否定的。
您需要以下内容:
switch (MyEnum)
{
case 1:
case 2:
DoSomething();
break;
case 3:
if (Year > 2012) DoSomething();
break;
}
答案 3 :(得分:1)
您无法为案例添加条件。 Case子句必须是编译时常量。相反,您可以在case语句中使用if语句。
case 3:
if( > 2012)
{
//Do Something here..........
}
break;
答案 4 :(得分:0)
您必须使用案例中的if条件,不能使用&amp;&amp;在case语句中,使用如下:
switch(MyEnum)
{
case 1:
case 2:
case 3: //Additional Condtion Here
if (Year > 2012)
{
//Do Something here..........
}
break;
case 4:
case 5:
//Do Something here..........
break;
}
答案 5 :(得分:0)
或者,您也可以将条件添加到交换机:
switch (MyEnum!=3 || Year>2012 ? MyEnum : -1)
{
case 1:
case 2:
case 3:
//Do Something here..........
break;
case 4:
case 5:
//Do Something here..........
break;
}
答案 6 :(得分:0)
大多数时候,我都会做类似的事情...
(对不起命名,用例并没有启发我)
考虑这些私人课程:
private class NumberState
{
public static NumberState GetState(int number, int year)
{
if (number == 1)
return new FirstNumberState();
if (number == 2)
return new FirstNumberState();
if (number == 3 && year > 2012)
return new FirstNumberState();
if (number == 4)
return new SecondNumberState();
if (number == 5)
return new SecondNumberState();
return new DefaultNumberState();
}
}
private class FirstNumberState : NumberState { }
private class SecondNumberState : NumberState { }
private class DefaultNumberState : NumberState { }
然后您可以做:
switch (NumberState.GetState(MyEnum, Year))
{
case FirstNumberState _:
// do something
break;
case SecondNumberState _:
// do something
break;
case DefaultNumberState _:
default:
throw new Exception("Unhandled number state");
}
即使您的病情变得更加复杂,也很容易阅读。
答案 7 :(得分:0)
您可以使用 C# 8 功能
public static bool SomeHelper(int value)
=> value switch
{
100 => true,
var x when x >= 200 && x <= 300 => true,
_ => false, // All other values
};
您将拥有值为 100、200...300 的 true
和带有其他值的 false
你也可以使用参数:
public static bool SomeHelper(int value, bool param)
=> value switch
{
100 => true,
var x when x >= 200 && x <= 300 && param => true,
_ => false, // All other values
};
在这种情况下,只有当 true
为 100 且 value
为假时,您才会有 param