2012-12-18 19 views
9

sto cercando di utilizzare switch case invece di If Else istruzione, in cui devo prima controllare la lunghezza della stringa e come da quello che devo fare casi di esso.switch case con espressione intera

switch (mystring.length) 
{ 
    case <=25: 
    { 
     //do this 
     break; 
    } 
    case <50: 
    { 
     //do this 
     break; 
    } 
    default: 
     break; 
} 

Questa è una cosa che voglio fare, ma in grado di ottenere come mettere <25 davanti a caso perché non è appropriato come da regolamento di caso di commutazione.

+4

Perché si vuole utilizzare 'switch' per questo compito? Perché è "se" male per te? – horgh

+0

http://www.dotnetperls.com/switch Il caso di commutazione richiede che ciascun caso sia costante .... –

+0

Leggere attentamente [parametro MSDN (riferimento C#)] (http://msdn.microsoft.com/en-us /library/06tc147t%28v=vs.90%29.aspx). – horgh

risposta

13

È sempre meglio utilizzare se/else per il caso particolare, con l'istruzione switch non è possibile inserire le condizioni nel caso. Sembra che si stiano verificando gli intervalli e se l'intervallo è costante, è possibile provare il seguente (se si desidera utilizzare l'istruzione switch).

int Length = mystring.Length; 
int range = (Length - 1)/25; 
switch (range) 
{ 
    case 0: 
     Console.WriteLine("Range between 0 to 25"); 
     break; 
    case 1: 
     Console.WriteLine("Range between 26 to 50"); 
     break; 
    case 2: 
     Console.WriteLine("Range between 51 to 75"); 
     break; 

} 
+0

cosa succede se intervallo = 22/25 ??????? passerà al caso predefinito anziché al primo caso. – neerajMAX

+1

@neerajMAX, se la lunghezza è '22' allora andrà al primo caso, poiché' (22 - 1)/25' è '0', la sua divisione intera :) – Habib

+1

oopsss !!! hai ragione ....: P thankx :) – neerajMAX

2

Non è possibile eseguire questa operazione con switch ma potrebbe esserci un rimedio per questo.

Dictionary<int, Action> actions = new Dictionary<int, Action>() 
    { 
     {25,()=>Console.WriteLine("<25")}, 
     {49,()=>Console.WriteLine("<50")}, 
     {int.MaxValue,()=>Console.WriteLine("Default")}, 
    }; 


actions.First(kv => mystring.length < kv.Key).Value(); 
+1

Questa soluzione può essere estesa per essere più generale. Il primo elemento di Tuple può essere di tipo Func per fornire una corrispondenza più generica. –

+1

Non penso che sia affidabile. [Non esiste un ordine definito per 'Dictionary's] (http://stackoverflow.com/a/4007787/382780), quindi è possibile selezionare qualsiasi coppia valida, non solo il" primo ". Questo dovrebbe probabilmente essere un elenco di 'Tuple ' in modo che ci sia ordine alla valutazione. – 31eee384

2

Prova questo:

int range = (int) Math.Floor(mystring.Length/25); 

switch (range) { 
case 0: 

    //do this <= 25 
    break; 

case 1: 

    //do this < 50 & > 25 
    break; 

default: 
    break; 
}​ 
+0

Se vedessi questo in codice sarei molto confuso e mettere in discussione l'uso di 'data'. – Default

2

Questo davvero non aiuta il PO molto, ma speriamo che aiutare qualcuno alla ricerca di questo in futuro.

Se si utilizza C# 7 (disponibile in Visual Studio 2017), è possibile switch on a range.

Esempio:

switch (mystring.length) 
{ 
    case int n when (n >= 0 && n <= 25): 
    //do this 
    break; 

    case int n when (n >= 26 && n <= 50): 
    //do this 
    break; 
} 
Problemi correlati