2011-11-16 22 views
13

Tôi có phát điên hoặc có cách nào, trong C#, để đặt biến thành kết quả của chuyển đổi không? Một cái gì đó như:Đặt Biến thành Kết quả của Biến đổi

var a = switch(b) 
    { 
    case c: 
    d; 
    case e: 
    f; 
    default: 
    g; 
    }; 

Có thể bằng bất kỳ ngôn ngữ nào khác không? Tôi chỉ nghĩ rằng đó là, nhưng tôi không nhận được bất cứ điều gì để biên dịch. Cảm ơn trước.

+3

'switch (b) {case c: a = d; trường hợp e: a = f; mặc định: a = g;} ' –

+0

F # giống như thế này – BLUEPIXY

Trả lời

20

Không, switch là tuyên bố thay vì biểu thức có thể được đánh giá.

Tất nhiên, bạn có thể giải nén nó vào một phương pháp khác:

int x = DoSwitch(y); 

... 

private int DoSwitch(int y) 
{ 
    switch (y) 
    { 
     case 0: return 10; 
     case 1: return 20; 
     default: return 5; 
    } 
} 

Ngoài ra, bạn có thể sử dụng một Dictionary nếu nó chỉ là một trường hợp đơn giản, ánh xạ liên tục. Nếu bạn có thể cung cấp cho chúng tôi thêm thông tin về những gì bạn đang cố gắng đạt được, chúng tôi có thể giúp bạn tìm ra cách thành công nhất để đến đó.

+0

Không, tôi chắc chắn có thể tìm ra nó theo một triệu cách, tôi chỉ có a = bất kỳ điều gì trong mỗi câu và nghĩ rằng tôi đã thấy điều này xảy ra. Đoán không. Ồ, tốt. Không phải vấn đề lớn. – vbullinger

+0

Một 'Từ điển' là chính xác những gì tôi cần, cảm ơn! –

12

Không, bạn không thể sử dụng câu lệnh chuyển đổi làm biểu thức. Một cách khác để viết nó được lồng các nhà khai thác có điều kiện:

var a = b == c ? d: 
     b == e ? f: 
       g; 
1

số

Một tuyên bố switch cung cấp nhánh kiểm soát. Nó không phải là một hàm đánh giá cái gì đó có thể được gán cho một biến.

6

Điều này không thể thực hiện được trong C#.

Gần nhất sẽ là một trong hai di chuyển này vào một phương pháp, hoặc làm nhiệm vụ trong từng trường hợp cá nhân, ví dụ:

int a; 
switch(b) 
{ 
case c: 
    a = d; break; 
case e: 
    a = f; break; 
default: 
    a = g; break; 
}; 

Có thể trong bất kỳ ngôn ngữ khác?

Có. Ví dụ, hầu hết các ngôn ngữ chức năng hỗ trợ một cái gì đó tương tự. Ví dụ, F # 's pattern matching cung cấp một phiên bản (mạnh hơn) của điều này.

6

Nếu bạn không đặc biệt lo ngại về hiệu quả, nó sẽ là khá dễ dàng để nấu lên một lớp ít sử dụng Generics cho phép bạn sử dụng một "thông thạo" chuỗi các phương pháp gọi là như thế này:

var a=Switch(b).Case(c).Then(d).Case(e).Then(f).Default(g); 

hoặc, nếu bạn thích, nhỏ gọn hơn

var a=Switch(b).Case(c, d).Case(e, f).Default(g); 

Nếu đây bạn quan tâm, tôi muốn được hạnh phúc để nấu lên một ví dụ

+1

Ồ, đây chính xác là những gì tôi đã làm [ở đây] (http://stackoverflow.com/questions/3334138/combine-return-and-switch/3334876#3334876) –

+2

Ồ, thật ngọt ngào !!! –

+0

... mặc dù tôi nghĩ rằng việc triển khai của bạn có thể được đơn giản hóa ... bạn có thể làm điều đó với cấu trúc dữ liệu không thay đổi và không cần phải duy trì từ điển. Tôi có thể nhận xét về chủ đề khác nếu bạn không nhớ :-) –

3

switch trong C# là một tuyên bố không có giá trị "trả về". Nếu bạn quan tâm đến việc có một "công tắc" biểu hiện, bạn có thể tìm thấy ít lớp thạo mà tôi đã viết here để có mã như thế này:

a = Switch.On(b) 
    .Case(c).Then(d) 
    .Case(e).Then(f) 
    .Default(g); 

Bạn có thể đi một bước xa hơn và khái quát ngay cả điều này hơn với các tham số hàm theo phương thức Then.

1

Tôi muốn điều tương tự vì tôi sử dụng Ruby khá nhiều và cho phép bạn làm điều đó.Vì vậy, tôi tạo ra một gói nuget gọi là FluentSwitch.

+0

Thật tuyệt vời, cảm ơn! – vbullinger

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