2012-12-18 34 views
9

Tôi đang cố gắng sử dụng switch case thay vì tuyên bố If Else, trong đó tôi phải kiểm tra chiều dài chuỗi đầu tiên và theo đó tôi phải tạo các trường hợp.trường hợp chuyển đổi có biểu thức số nguyên

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

Đây là một số điều tôi muốn làm nhưng không thể có được làm thế nào để đưa <25 trước trường hợp vì nó không phải là thích hợp theo quy tắc chuyển đổi hợp cụ thể.

+4

Tại sao bạn muốn sử dụng 'switch' cho nhiệm vụ này? Tại sao 'if' có hại cho bạn? – horgh

+0

http://www.dotnetperls.com/switch Trường hợp chuyển đổi yêu cầu từng trường hợp phải không đổi .... –

+0

Vui lòng đọc [MSDN switch (C# Reference)] (http://msdn.microsoft.com/en-us /library/06tc147t%28v=vs.90%29.aspx). – horgh

Trả lời

13

Luôn luôn sử dụng tốt hơn nếu/trường hợp cụ thể của bạn, Với tuyên bố chuyển đổi, bạn không thể đặt điều kiện trong trường hợp này. Có vẻ như bạn đang kiểm tra phạm vi và nếu phạm vi là hằng số thì bạn có thể thử sau đây (nếu bạn muốn sử dụng báo cáo chuyển đổi).

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

nếu phạm vi = 22/25 ??????? nó sẽ đi đến trường hợp mặc định thay vì trường hợp đầu tiên. – neerajMAX

+1

@neerajMAX, nếu Độ dài là '22' thì nó sẽ đi đến trường hợp đầu tiên, vì' (22 - 1)/25' là '0', phân chia số nguyên của nó :) – Habib

+1

oopsss !!! ya bạn đúng ....: P thankx :) – neerajMAX

2

Bạn không thể thực hiện việc này với switch nhưng có thể có một giải pháp cho việc này.

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

Giải pháp này có thể được mở rộng để tổng quát hơn. Yếu tố đầu tiên của Tuple có thể thuộc loại Func để cung cấp kết hợp chung hơn. –

+1

Tôi không nghĩ điều này là đáng tin cậy. [Không có thứ tự được định nghĩa cho 'Dictionary's] (http://stackoverflow.com/a/4007787/382780), vì vậy bất kỳ cặp hợp lệ nào cũng có thể được chọn, không chỉ là" đầu tiên ". Điều này có lẽ nên là một danh sách của 'Tuple ' để có thứ tự để đánh giá. – 31eee384

2

Hãy thử điều này:

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

Nếu tôi thấy điều này trong mã tôi sẽ rất bối rối và đặt câu hỏi về việc sử dụng 'dữ liệu'. – Default

2

Điều này thực sự không giúp OP nhiều, nhưng hy vọng nó sẽ giúp ai đó tìm kiếm này trong tương lai.

Nếu bạn đang sử dụng C# 7 (Có sẵn trong Visual Studio 2017), bạn có thể switch on a range.

Ví dụ:

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; 
} 
Các vấn đề liên quan