2009-10-12 31 views
31

tôi phải thực hiện những điều sau đây trong một tuyên bố switch:Đánh giá Expressions trong Switch câu lệnh trong C#

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    case < 0: 
    // some code ; 
    break; 
} 

Có thể có câu lệnh switch đánh giá case < 0? Nếu không, làm thế nào tôi có thể làm điều đó?

+4

Vui lòng không gắn cờ câu hỏi của bạn là "Khẩn cấp", ngay cả khi nó là dành cho bạn: http://catb.org/~esr/faqs/smart-questions.html#urgent –

Trả lời

57

Bạn không thể - chuyển/trường hợp chỉ dành cho các giá trị riêng lẻ. Nếu bạn muốn chỉ định điều kiện, bạn cần một "if":

if (num < 0) 
{ 
    ... 
} 
else 
{ 
    switch(num) 
    { 
     case 0: // Code 
     case 1: // Code 
     case 2: // Code 
     ... 
    } 
} 
+0

Cảm ơn bạn rất nhiều –

+22

hoặc thậm chí switch (num) {case 0: case 1: default: if (num <0) {..}} – falstro

+2

@roe: Vâng, tôi cũng xem xét việc đưa ra biểu mẫu đó. Ran hết thời gian mặc dù :) –

5

Bạn sẽ phải sử dụng nếu, bạn muốn hay không. Chuyển đổi chỉ có khả năng so sánh giá trị của bạn với các giá trị không đổi.

+1

Không đúng - bạn có thể sử dụng toán tử bậc ba để hợp nhất trường hợp nhỏ hơn 0 thành một giá trị và đánh giá công tắc điện. –

+0

Điều này đúng. Nó chỉ là một hạn chế của ngôn ngữ. Bạn thực sự có thể làm điều này trong VB.Net, cũng như những thứ khác như sử dụng dãy giá trị. Giống như C#, nếu phải so sánh với giá trị chữ, nhưng có nhiều hoạt động so sánh hơn. –

+0

Charles thật sao? Hấp dẫn. Tôi không biết điều đó. –

7

Nếu num bạn không thể ít hơn không:

public int GetSwitch(int num) { return num < 0 ? -1 : num; } 
switch(GetSwitch(num)) 
{ 
case 4: // some code ; break; 
case 3:// some code ; break; 
case 0: // some code ; break; 
case -1 :// some code ; break; 
} 

Nếu nó có thể, sử dụng một số khác "không tồn tại" số như int.MinValue.

+0

Đó là những gì tôi định đề xuất - nhưng tại sao lại đặt ternary vào một chức năng khác? –

+0

giải pháp thú vị +1, mặc dù cá nhân tôi cảm thấy chức năng gọi bổ sung làm xáo trộn chế độ xem một chút, 'chuyển đổi (num <0? -1: num)' chỉ cảm thấy dễ bị phát hiện hơn. – falstro

+0

Tôi là một người theo dõi lớn của SRP và DRY - vì vậy thậm chí vô thức tôi tách một hành vi khỏi một hành vi không liên quan khác. GetSwitch(), ví dụ, có thể được tái sử dụng, và những gì nếu bạn cần hai thiết bị chuyển mạch - bạn có sao chép/dán ternary của bạn vào đó? Tôi không xem xét sao chép/dán một thực hành tốt. – queen3

5

Cách duy nhất tôi có thể nghĩ đến (và tôi thực sự không recommand nó), sẽ là như sau:

int someValue; 

switch (Math.Max(someValue, -1)) 
{ 
    case -1: 
     // will be executed for everything lower than zero. 
     break; 

    case 0: 
     // will be executed for value 0. 
     break; 

    case 1: 
     // will be executed for value 1. 
     break; 

    default: 
     // will be executed for anything else. 
     break; 
} 
+0

Tại sao tôi bị giảm giá? –

+0

Tại sao không chỉ Math.Max ​​(someValue, -1)? Sau đó, anh ta không cần phải lo lắng về việc bù đắp +1 ... – JustLoren

+0

Đã không downvote bạn nhưng tôi nghĩ rằng nó chỉ là Bad Style. – chakrit

13

Bạn có thể làm một cái gì đó như thế này ở phần cuối của câu lệnh switch của bạn:

default: 
    if(num < 0) 
    { 
     ... // Code 
    } 
    break; 
3

Một cách khác xung quanh sẽ có thể cũng (liên quan đến câu trả lời của Jon Skeet):

switch(num) 
{ 
    case a: 
     break; 
    default: 
     if(num < 0) 
     {} 
    break; 
} 
1

Bạn không thể cho chúng tôi so sánh e trong các thiết bị chuyển mạch như bạn có thể trong VB, bạn có 2 tùy chọn tại đây, thay thế giá trị bạn bật bằng giá trị đã biết và sử dụng giá trị đó hoặc - nếu bạn ngụ ý tất cả các trường hợp khác - bạn có thể sử dụng mệnh đề mặc định:

switch(num) 
{ 
    case 4: 
    // some code ; 
    break; 
    case 3: 
    // some code ; 
    break; 
    case 0: 
    // some code ; 
    break; 
    default: 
    // some code ; 
    break; 
} 

Lưu ý rằng điều này không chính xác như bạn đã yêu cầu: bất kỳ giá trị nào khác 0,3,4 sẽ kết thúc trong mệnh đề deafult :.

Các vấn đề liên quan