2012-07-05 9 views
10

W języku C# instrukcja switch nie zezwala na przypadki obejmujące zakresy wartości. Nie podoba mi się pomysł wykorzystania pętli if-else do tego celu, więc czy istnieją inne sposoby sprawdzania zakresów liczbowych w C#?Przełączanie obudowy, sprawdzanie zasięgów w języku C# 3.5

+0

Jak duży jest zakresy? – leppie

+0

Naprawdę nie można tego zrobić w języku C# (chyba że jest to mały zakres liczb, które można wyświetlać w blokach), ale na raz ** można ** w VB.Net - http://stackoverflow.com/questions/1009902/select-case-to-check-range-of-a-decimal-number funnily – dash

+0

Cóż, możesz mieć metodę zwracającą bool, która przyjmuje zakres, a następnie, jeśli pętle, jest prosta, czytelna i działa dobrze – V4Vendetta

Odpowiedz

15

można użyć HashTable odpowiednio Dictionary stworzyć odwzorowanie Condition => Action.

przykład:

class Programm 
{ 
    static void Main() 
    { 
     var myNum = 12; 

     var cases = new Dictionary<Func<int, bool>, Action> 
     { 
      { x => x < 3 , () => Console.WriteLine("Smaller than 3") } , 
      { x => x < 30 , () => Console.WriteLine("Smaller than 30") } , 
      { x => x < 300 , () => Console.WriteLine("Smaller than 300") } 
     }; 

     cases.First(kvp => kvp.Key(myNum)).Value(); 
    } 
} 

Ta technika jest ogólnie alternatywę switch, zwłaszcza działania składa się tylko z jednej linii (jak połączenia metody).

A jeśli jesteś fanem typu aliasów:

using Int32Condition = System.Collections.Generic.Dictionary<System.Func<System.Int32, System.Boolean>, System.Action>; 
... 
    var cases = new Int32Condition() 
    { 
     { x => x < 3 , () => Console.WriteLine("Smaller than 3") } , 
     { x => x < 30 , () => Console.WriteLine("Smaller than 30") } , 
     { x => x < 300 , () => Console.WriteLine("Smaller than 300") } 
    }; 
+1

+1 za fajny pomysł – Alex

+2

Ale nie powinieneś brać słownika (weź listę KeyValuePair, Tuple lub sth self defined) inaczej nie możesz przewidzieć w jakiej kolejności wywoływane są Funki do testowania. – Oliver

+1

Interesujące, ale gdybym zobaczył ten wzorzec jako zamiennik if/else w prawdziwym projekcie, przesyłam go na http://thedailywtf.com :) – Stilgar

5

Nie. Oczywiście, jeśli zakresy są małe, można zastosować podejście zbliżone, ale inne niż: nie. Użyj if/else.

1

Nie. Co najmniej nic, co jest piękniejsze.

Również nie ma C# 3.5 tylko .NET 3.5 i C# 3.0

4

jeśli przerwa zakresów jest stały, można spróbować

 int num = 11; 
     int range = (num - 1)/10; //here interval is 10 
     switch (range) 
     { 
      case 0: 
       Console.Write("1-10"); 
       break; // 1-10 
      case 1: 
       Console.Write("11-20"); 
       break; // 11-20 
      // etc... 
     } 

wyjściowy będzie: "11-20"
jeśli przerwa jest zmienna następnie użyć if/else

1

spróbować czegoś jak ten

private void ExecuteInRange(Dictionary<Range,Action<int>> ranges) 
    { 
     foreach (var range in ranges) 
     { 
      if (range.Key.Value < range.Key.Max && range.Key.Value > range.Key.Max) 
       range.Value(range.Key.Value); 
     } 
    } 


public class Range 
{ 
    public int Min { get; set; } 
    public int Max { get; set; } 
    public int Value { get; set; } 
} 
-1

pewnego rodzaju skrót zagnieżdżonego-if-else rzeczą działa i jest czysty.

myModel.Value = modelResult >= 20 ? 5 : modelResult >= 14 ? 4 : modelResult >= 5 ? 3 : modelResult >= 2 ? 2 : modelResult == 1 ? 1 : 0; 
+0

jakikolwiek powód obniżenia wersji? Przekręciłem 20 linii kodu na 1. – blomster

+4

To jest przerażające. – ediblecode

1
 int b; 
     b = Int32.Parse(textBox1.Text); 

     int ans = (100-b)/3; //the 3 represents the interval 
     //100 represents the last number 


     switch(ans) 
     { 

      case 0: 
       MessageBox.Show("98 to 100"); 
      break; 

      case 1: 
       MessageBox.Show("95 to 97"); 
      break; 

      case 2: 
       MessageBox.Show("92 to 94"); 
      break; 

      case 3: 
       MessageBox.Show("89 to 91"); 
      break; 

      case 4: 
       MessageBox.Show("86 to 88"); 
      break; 

      default: 
       MessageBox.Show("out of range"); 
      break;