2012-07-05 32 views
10

Trong C#, câu lệnh switch không cho phép các trường hợp mở rộng phạm vi giá trị. Tôi không thích ý tưởng sử dụng các vòng if-else cho mục đích này, vậy có cách nào khác để kiểm tra các dãy số trong C# không?Trường hợp chuyển đổi, phạm vi kiểm tra trong C# 3.5

+0

Phạm vi lớn bao nhiêu? – leppie

+0

Bạn không thể thực sự làm điều đó trong C# (trừ khi đó là một phạm vi nhỏ các số bạn có thể liệt kê trong các khối), nhưng, một lần, bạn ** có thể ** trong VB.Net - http://stackoverflow.com/questions/1009902/select-case-to-check-range-of-a-số thập phân funnily đủ – dash

+0

Vâng, bạn có thể có một phương pháp trở lại bool mà mất trong phạm vi và sau đó nếu vòng, đơn giản, dễ đọc và làm việc tốt – V4Vendetta

Trả lời

15

Bạn có thể sử dụng HashTable tương ứng Dictionary để tạo ánh xạ Condition => Action.

Ví dụ:

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(); 
    } 
} 

Kỹ thuật này là một thay thế chung để switch, đặc biệt là nếu những hành động bao gồm duy nhất của một dòng (giống như một lời gọi phương thức).

Và nếu bạn là một fan hâm mộ của loại bí danh:

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 cho ý tưởng hay – Alex

+2

Nhưng bạn không nên dùng từ điển (lấy danh sách KeyValuePair, Tuple hoặc sth self) nếu không bạn không thể dự đoán thứ tự Func được gọi để kiểm tra. – Oliver

+1

Thú vị nhưng nếu tôi thấy mô hình này như là một sự thay thế nếu/người nào khác trong dự án thực tôi đang gửi nó đến http://thedailywtf.com :) – Stilgar

5

Không. Tất nhiên, nếu phạm vi nhỏ, bạn có thể sử dụng phương thức

case 4: 
case 5: 
case 6: 
    // blah 
    break; 

, nhưng khác hơn là: không. Sử dụng if/else.

1

Không. Ít nhất là không có gì đẹp hơn.

Cũng không có C# 3.5 chỉ .NET 3.5 và C# 3.0

4

nếu khoảng thời gian của dãy là hằng số, bạn có thể thử

 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... 
     } 

Output sẽ là: "11-20"
nếu khoảng thời gian là biến sau đó sử dụng if/else

1

Hãy thử một cái gì đó như thế này

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

Một loại lồng nhau là cách gọi tắt if-else điều hoạt động, và là sạch.

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

bất kỳ lý do gì để hạ cấp? Tôi đã biến 20 dòng mã thành 1. – blomster

+4

Điều đó thật khủng khiếp. – 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; 
Các vấn đề liên quan