2010-03-01 40 views
38

Khá thường xuyên trong mã của tôi, tôi cần phải so sánh một biến với một số giá trị:So sánh một biến để nhiều giá trị

if (type == BillType.Bill || type == BillType.Payment || type == BillType.Receipt) 
{ 
    // Do stuff 
} 

tôi tiếp tục suy nghĩ tôi có thể làm:

if (type in (BillType.Bill, BillType.Payment, BillType.Receipt)) 
{ 
    // Do stuff 
} 

Nhưng thats nhiên SQL cho phép điều này.

Có cách nào gọn gàng hơn trong C# không?

+1

ngôn ngữ như Python và Ruby cũng có toán tử "in". –

+0

@Can Berk Güder: Tôi vừa tìm kiếm toán tử "in" này trong Ruby nhưng không thể tìm thấy nó hay bất cứ thứ gì tương tự. Bất kỳ ý tưởng? –

+1

[1,2,3] .include? (1) –

Trả lời

58

Bạn có thể làm với với Chứa như thế này:

if(new[]{BillType.Receipt,BillType.Bill,BillType.Payment}.Contains(type)){} 

Hoặc, tạo ra phương pháp mở rộng của riêng bạn mà hiện nó với một cú pháp dễ đọc hơn

public static class MyExtensions 
{ 
    public static bool IsIn<T>(this T @this, params T[] possibles) 
    { 
     return possibles.Contains(@this); 
    } 
} 

Sau đó gọi nó bằng cách:

if(type.IsIn(BillType.Receipt,BillType.Bill,BillType.Payment)){} 
0

Thử sử dụng C# HashSet để biết danh sách giá trị. Điều này có thể đặc biệt hữu ích nếu bạn cần so sánh nhiều giá trị với một tập hợp các giá trị.

6

Giả sử loại là một liệt kê, bạn có thể sử dụng FlagsAttribute:

[Flags] 
enum BillType 
{ 
    None = 0, 
    Bill = 2, 
    Payment = 4, 
    Receipt = 8 
} 

if ((type & (BillType.Bill | BillType.Payment | BillType.Receipt)) != 0) 
{ 
    //do stuff 
} 
+0

Thật không may điều này sẽ chỉ làm việc cho enums rằng havent có giá trị của họ đã được xác định. Trong trường hợp cụ thể này, BillTypes của chúng tôi đã được định nghĩa là 1-8 ... Đáng buồn thay .. Tôi thích sự gọn gàng của cái này .. –

+5

Tôi muốn khuyên bạn nên đặt FlagsAttribute cho những thứ được, tốt, cờ. Trang trí BillType với '[Flags]' nói với tôi rằng bất kỳ sự kết hợp của BillTypes có thể được áp dụng cho giá trị, mà rõ ràng không phải là trường hợp. –

+0

@ Giống như trong trường hợp đó tại sao điều tương tự cũng cần được thực hiện đối với họ. Trong một hệ thống khác, một BillType thực sự có thể là một lá cờ. Mặc dù bạn đúng, có vẻ như một mùi mã với tôi. Tôi có thể hạ nó xuống. –

0

Hãy thử kiểm tra ra các mẫu thiết kế chiến lược (còn gọi là các mẫu thiết kế chính sách).

public interface IBillTypePolicy 
{ 
    public BillType { get; } 
    void HandleBillType(); 
} 
public class BillPolicy : IBillTypePolicy 
{ 
    public BillType BillType { get { return BillType.Bill; } } 

    public void HandleBillType() 
    { 
     // your code here... 
    } 
} 

Đây là great post on how to dynamically resolve the policy từ Los Techies.

+0

Mẫu tốt, sai sự cố. Điều này không trả lời câu hỏi gốc! –

+0

Tôi thấy bạn đến từ đâu. Đó là một giải pháp cấp cao hơn cho vấn đề và có thể đáng để suy ngẫm trong một số trường hợp nếu Im đặt nhiều câu lệnh if xung quanh địa điểm. –

9

Ngoài ra còn có tuyên bố chuyển đổi

switch(type) { 
    case BillType.Bill: 
    case BillType.Payment: 
    case BillType.Receipt: 
     // Do stuff 
     break; 
} 
3

Hãy thử sử dụng một công tắc

switch (type) 
    { 
     case BillType.Bill: 
     case BillType.Payment: 

     break; 
    } 
Các vấn đề liên quan