Write a switch statement with one case containing the other - c#

I would like to write a switch statement with three cases: A, B and C.
However, C is going to contain everything covered in A and then will add some other statements after that.
So if case A writes to a file, case C is supposed to write to a file and then write it to a table, too. How can we achieve this behavior without repeating the code for A in C?

put A's code in a method and then call it from A and C and then add the extra code before the break of C
public void Foo (){}
switch(variable)
{
case a: Foo(); break;
case b: otherMethod(); break;
case c: Foo(); ExtraWork(); break;
}

Another alternative : C# have a goto statement which might come in handy [Less codes]
switch (CASE){
case A:
JUMP:
// Code for A
break;
case B:
// code for B
break;
case C:
// Code for C
goto JUMP; // Will jump to A
}

You can create a method for writing to file.
public void Write(){
//your code here.
}
Now from switch statement case A and C call Write(). For case C after calling Write(), you can execute other codes.

In your case I think about two options:
The first is having a distinct case for each value and extract the code in a private method that is called in both case:
switch (caseSwitch)
{
case a:
YourPrivateMethod();
break;
case b:
// What ever you want to do
break;
case c:
YourPrivateMethod();
break;
default:
Console.WriteLine("Default case");
break;
}
private void YourPrivateMethod()
{
//some stuff
}
Second one is having a shared case for a and c :
switch (caseSwitch)
{
case a:
case c:
// Do what A should
if(caseSwitch == c)
{
// Do what C should
}
break;
case b:
// What ever you want to do
break;
default:
Console.WriteLine("Default case");
break;
}
Regards.

Related

Extra condition in switch case (Fallthrough?)

I need to use an extra condition in a switch case in C#. Let's say that we have a couple of cases that required to do Stuff A and B, but case 4 requires Stuff C + Stuff Extra:
public void myFunction(int value)
{
switch(value)
{
case 0:
//Stuff A
break;
case 1:
//Stuff B
break;
case 2:
case 3:
case 4:
//Stuff C
//Am I forced to use an If to a special condition of case 4?
if(value == 4)
{
//Extra stuff for case 4
}
break;
}
}
Is there another way to do it without using an If statement?
I tried a solution with goto and it actually works. Thank you for your answers:
public void myFunction(int value)
{
switch (value)
{
case 0:
//Stuff A
break;
case 1:
//Stuff B
break;
case 2:
case 3:
//Stuff C
break;
case 4: //Requires "Extra stuff" and "Stuff C"
//Extra stuff for case 4
goto case 3;
//another possible cases...
case 5:
//etc
break;
}
}
Please notice that this solution will only work in cases that do NOT require a concrete order in the execution of the statements.
If for example in this case "Extra stuff" must be executed after "Stuff C" the correct way to do it is using an If statement inside case 3.
Here's a bit of an odd one, combining local functions with switch:
I DO NOT recommend writing this code:
void Main()
{
int value = 4;
switch (value)
{
case 0:
//Stuff A
break;
case 1:
//Stuff B
break;
case 2:
case 3:
common234(); void common234()
{
Console.WriteLine("2-4");
}
break;
case 4:
common234();
Console.WriteLine("only 4");
break;
//another possible cases...
case 5:
//etc
break;
}
}

C# switch statement with curly braces for each case/default block within the switch statement?

Typically, a switch statement in C# looks like this
switch (sh)
{
case 1:
DoThis();
DoThat();
break;
case 2:
DoThis();
DoThat();
break;
default:
DoThis();
DoThat();
break;
}
But for the first time ever, I saw someone using curly braces for each case statement within a switch statement like below:
switch (sh)
{
case 1:
{
DoThis();
DoThat();
break;
}
case 2:
{
DoThis();
DoThat();
break;
}
default:
{
DoThis();
DoThat();
break;
}
}
Why are these curly braces {, } being used for each case and default blocks of the case statement above?
Why are they needed?
What is the difference?
They are not required, but they are useful if you declare variables with the same name in multiple branches:
switch (sh)
{
case 1:
var test = "test";
Console.WriteLine(test);
break;
case 2:
var test = "test";
Console.WriteLine(test);
break;
}
This will not compile, complaining about conflicting variable names. But if you add braces
switch (sh)
{
case 1:
{
var test = "";
Console.WriteLine(test);
break;
}
case 2:
{
var test = "";
Console.WriteLine(test);
break;
}
}
that will create its own scope for each branch and it will compile fine.
Some people get used to this and always add bracers, even when not defining any variables.
The issue you sometimes face in a switch statement is that all the cases are in the same scope. That means (for example) that you can not use the same variable name in two cases. Consider this:
switch (sh)
{
case 1:
int result = 1;
return result;
case 2:
int result = 2;
return result;
}
This will lead to a compiler error, since you are declaring result twice in the same scope. You remove the error by introducing new scopes in the cases:
switch (sh)
{
case 1:
{
int result = 1;
return result;
}
case 2:
{
int result = 2;
return result;
}
}
Considering that switch cases are somewhat controversial, because they introduce additional complexity, adding extra scopes adds to the confusion. I prefer to use switch blocks in a way that does not lead to the described problem (by keeping the amount of code in the cases low and try to avoid large switch blocks).
In your example the scopes are not needed and I would not use them on a general basis, since this is "unusual" code. And unusual usually means confusing. Your question is a proof to that opinion (and it is an opinion, just to avoid a religious war here), since this construct confused you enough to ask the question.
I belive this is remains of old code. I remember in C when I didnt put the break I would just fall in the next case...
This is no longer relevant and is just code style.
Note you can also do
switch (sh)
{
case 1:
DoThis();
DoThat();
break;
case 2:
{
DoThis();
DoThat();
}break;
case 3:
case 4:
{
DoThis();
DoThat();
}
case 5:
goto case 1;
default:
{
DoThis();
DoThat();
}
}
The break will just leave the Switch but which will be left after leaving the bracket.

C# Change If to switch, how to handle "and"

So I have a task from a worksheet at work:
I have to change these Ifs to a switch, but how do i do it? Heres the Ifs:
if (i<0 || i>15) Console.WriteLine ("A");
else if (i%5<2 && i/3>3) Console.WriteLine ("B");
else if (3<i && i<10) Console.WriteLine ("C");
else if (i&2==2) Console.WriteLine ("D");
else Console.WriteLine ("E");
and here is the switch i made, but that one is bad, but i dont know how to make a good one out of it, i hope you can help me with this.
switch (i)
case (i<0):
case (i>15):
Console.WriteLine ("A“)
Break;
Case (i%5<2 && i/3>3) :
Console.WriteLine ("B“)
Break;
case (3<i && i<10) :
Console.WriteLine ("C");
Break;
Case (i&2==2) :
Console.WriteLine ("D");
Break;
Default
Console.WriteLine ("E");
Break;
It doesnt have to run in a programm, it's just a task from a worksheet
I haven't figured out all the rules completely, but I think what you're after is something like this:
The question wants you to realise that you've got a limited number of results, since the first rule is (i<0 || i>15). This can be the default for a switch statement.
Then you need to work out what would happen for all integers 0-15 and write them into the rest of the switch.
So you're after something along the lines of (although this doesn't have your logic - you can figure that out so you understand what's going on):
switch (i)
{
case 0:
case 2:
case 5:
Console.Write("Something")
break;
case 1:
case 7:
Console.Write("Something Else")
break;
default
Console.WriteLine ("A“)
Break;
}
I think it's:
switch (i)
{
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
Console.WriteLine("C");
break;
case 0:
case 1:
case 3:
case 10:
case 11:
case 12:
case 13:
case 14:
Console.WriteLine("E");
break;
case 2:
Console.WriteLine("D");
break;
case 15:
Console.WriteLine("B");
break;
default:
Console.WriteLine("A");
break;
}
Use a separate variable, in which you have to embed the segmentation logic. Here is a sample:
//using enum
public enum MySwitchableVariable {
NotDefined, //optional
LessThanZero,
MoreThanFifteen,
RestOfFiveLessThanTwoAndFactorMoreThanThree, //its too complex to describe
BetweenThreeAndTen,
RestOfTwoIsTwo,
}
Then you have to make a function which takes an integer and spit out a case of this enum:
public MySwitchableVariable calculate(int i) {
var result = MySwitchableVariable.NotDefined;
// your implementation here
return result;
}
finally you may switch that annoying variable like this:
var Variable = calculate(i);
switch(Variable) {
case MySwitchableVariable.LessThanZero:
// you know the rest
is that what you (or your instructor) want?
Simply you can't do this. Using the switch statement entails that the variable in switch can take a number of discrete constant values.
From the documentation:
The switch statement is a control statement that selects a switch
section to execute from a list of candidates.
Furthermore,
Each case label specifies a constant value. The switch statement transfers control to the switch section whose case label matches the
value of the switch expression (caseSwitch in the example). If no case
label contains a matching value, control is transferred to the default
section, if there is one. If there is no default section, no action is
taken and control is transferred outside the switch statement. In the
previous example, the statements in the first switch section are
executed because case 1 matches the value of caseSwitch.

Preventing If within If functions (or cases)

I'm building a code where I have to go trough alot of if/case functions. This on itself is not really a problem only that alot of these if's are the kinda the same.
In my code it has to go trough an if function, and if there is a match it wont matter what match it is it will have to go trough the same next if. But depending on both answers it will have to go to a different part of the code.
So for exmaple:
Switch(A){
case 1:
Switch(B){
case 1: do11thing();
case 2: do12thing();
}
case 2:
Switch(B){
case 1: do21thing();
case 2: do22thing();
}
}
Does anyone know a solution instead of having to place the Switch(B) a lot of times within my code.
In case you have more jumps than executable code (the case that happens quite often when programming state machines), you may store your logic in some nested Dictionary, List and/or array object like the following:
// Maps A and B values to functionality
var funcs = new[] {
new[] { func00, func01, func02, ... },
new[] { func10, func11, func12, ... },
new[] { func20, func21, func22, ... },
...
};
// Actually runs functionality according to your mapping
funcs[A][B](params);
So, in case of A=1 and B=2, the func12 will be called.
Of course, you may use lambdas (params) => {} as funcs in the structure.
you can use one if for the function returning value 2 , and then inside this if use all possibilities as different switch cases.It will be smoother and faster than multiple if loops.
for ex :-
if (2 == function1) {
switch(value of function 2)
{
case value_1:
..//do whatever u want;
break;
case value_2:
..//do whatever u want;
break;
default:
//do some error handling;
break;
}
}
One thing you can do is combine cases. For example, say you have a string value that's your outer switch variable, and an int that's the inner switch variable. Your original code might be:
switch (theString)
{
case "Foo":
switch (theInt)
{
case 1: DoThing1(); break;
case 2: DoThing2(); break;
// many other cases
}
DoFooThing();
break;
case "Bar":
switch (theInt)
{
case 1: DoThing1(); break;
case 2: DoThing2(); break;
// other cases, same as with "Foo"
}
DoBarThing();
break;
}
You can combine the cases and have a conditional:
switch (theString)
{
case "Foo":
case "Bar":
switch (theInt)
{
case 1: DoThing1(); break;
case 2: DoThing2(); break;
// many other cases
}
if (theString == "Foo")
DoFooThing();
else
DoBarThing();
break;
}
The type of logic you're describing, especially if there are very many cases, is probably best implemented using a lookup table. Doing so makes it much easier to follow the logic. It takes a bit more time to set up, but you can easily see in the table that you construct exactly what will happen with any combination of input values.

C# switch/break

It appears I need to use a break in each case block in my switch statement using C#.
I can see the reason for this in other languages where you can fall through to the next case statement.
Is it possible for case blocks to fall through to other case blocks?
Thanks very much, really appreciated!
Yes, you can fall through to the next case block in two ways. You can use empty cases, which don't need a break, or you can use goto to jump to the next (or any) case:
switch (n) {
case 1:
case 2:
case 3:
Console.WriteLine("1, 2 or 3");
goto case 4;
case 4:
Console.WriteLine(4);
break;
}
The enforcement of "break" is there to stop bugs. If you need to force a fall-thru then use "goto case " (replace the with appropriate value)
the following example shows what you can do:
switch(n)
{
case 1:
case 2:
//do something for 1+2
//...
goto case 3;
case 3:
//do something for 3, and also extra for 1+2
//...
break;
default:
//do something for all other values
//...
break;
}
See http://msdn.microsoft.com/en-us/library/06tc147t%28VS.80%29.aspx
C# doesn't support implicit fall through construct, but the break (or goto) nonetheless has to be there (msdn). The only thing you can do is stack cases in the following manner:
switch(something) {
case 1:
case 2:
//do something
break;
case 3:
//do something else
}
but that break (or another jump statement like goto) just needs to be there.
In my C# (.NET 1.1, CF) code, both of these are allowed:
switch (_printerChoice)
{
case BeltPrintersEnum.ZebraQL220:
return new ZebraQL220Printer();
break;
case BeltPrintersEnum.ONeal:
return new ONealPrinter();
break;
default:
return new ZebraQL220Printer();
break;
}
switch (_printerChoice)
{
case BeltPrintersEnum.ZebraQL220:
return new ZebraQL220Printer();
case BeltPrintersEnum.ONeal:
return new ONealPrinter();
default:
return new ZebraQL220Printer();
}
...but with the breaks in, they are grayed out, so considered moot. So, at least in my case, they are allowed but not required.

Categories