2012-03-07 27 views
5

Có một cú pháp viết tắt trong C# để làm điều này:thử nghiệm cho nhiều giá trị trong một câu lệnh if trong C#

if ((x == 1) || (x==2) || (x==5) || (x==13) || (x==14)) 

... ngắn hơn? Một cái gì đó giống như (giả thuyết)

if (x in {1, 2, 5, 13, 14}) 

Tôi "cảm thấy" giống như nó tồn tại, tôi chỉ đi lên ngắn về tinh thần và Googly. Trong thực tế, tôi phải kiểm tra một loạt các enums thường xuyên và nó chỉ là không đọc được. Tôi cũng ghét phải tạo một hàm trợ giúp nhỏ nếu ngôn ngữ hỗ trợ nó.

Cảm ơn trước!

Sửa

Có nhiều giải pháp thông minh liên quan đến danh sách ... nhưng tôi đã hy vọng cho một cấu trúc logic thuần túy của một số loại. Nếu nó không tồn tại, vì vậy hãy là nó. Cảm ơn!

+0

http://stackoverflow.com/questions/3907299/c-sharp-if-statements-matching-multiple-values ​​ –

+0

Nó không phải là cần thiết để sử dụng dấu ngoặc kép bên trong: 'if (x == 1 || x == 2 || x == 5 ...) 'ngoại trừ nếu bạn đã sử dụng Pascal/Delphi vài năm và có" biến dạng chuyên nghiệp ". – i486

Trả lời

12

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

if ((new[]{1, 2, 5, 13, 14}).Contains(x)) ... 
+0

bạn đánh tôi với nó. –

+0

Vâng ... Tôi cho rằng nó sẽ sạch hơn một chút so với những gì tôi có. Trong trường hợp không có cú pháp siêu đơn giản, tôi chỉ sử dụng một hàm trợ giúp như 3907299 mà "Jeremy D" được đăng. Dù sao cũng cảm ơn bạn. – Adamlive

+0

'HashSet ' sẽ nhanh hơn 'Mảng'! =) –

0

Không, không có sự hỗ trợ cho việc so sánh trực tiếp như thế. Tuy nhiên, bạn có thể sử dụng các phương thức LINQ như Contains(). Tôi có thể cung cấp một ví dụ nhưng nó phụ thuộc vào cách các mục dữ liệu được lưu trữ ban đầu.

2

Mặc dù tôi nghĩ rằng câu lệnh if là tốt, và làm cho code ngắn gọn vì breifness là vô dụng, ở đây đi:

tiếp cận đầu tiên, giả sử bạn muốn đi con đường LINQ:

if ((new[]{1,2,5,13,14}).Contains(x)){ 
} 

Second cách tiếp cận, ArrayList

if ((new System.Collections.ArrayList(new[]{1,2,5,13,14})).Contains(x)){ 
} 

cách tiếp cận thứ ba, liệt kê:

if ((new System.Collections.Generic.List<Int32>(new[]{1,2,5,13,14})).Contains(x)){ 
} 

Nhưng hãy ghi nhớ tất cả các số này thêm chi phí cao hơn (và thực sự không thêm nhiều đến mức dễ đọc, do tính năng xem xét hiệu suất).

oh và working example of the above.

+0

Điểm tốt về chi phí. Điều này sẽ chạy thường xuyên hơn nhiều so với tôi cần phải đọc nó. – Adamlive

0

Bạn có lẽ có thể làm một cái gì đó như thế này:

if(Array.LastIndexOf(new int[]{1, 2,3,4}, x) != -1) 
{ 
    //YOUR CODE HERE 
} 

Không thử nghiệm, nhưng tôi tin rằng điều này sẽ làm việc.

chỉnh sửa Dường như một phản hồi tương tự đã được đăng.

2

Tôi muốn khuyên bạn sử dụng HashSet(T) Class để kiểm tra xem phần tử có thuộc tập hợp các phần tử hay không.

Hơn nữa, như HashSet<T> là nơi chứa kết hợp, phức tạp tra cứu của nó là O (1), ví dụ: thời gian liên tục: HashSet(Of T).Contains Method, trong khi ArrayList<T> có tra cứu thời gian tuyến tính: O (n). Vì vậy, HashSet<T> sẽ là tốt hơn để tra cứu.

HashSet<int> numbers = new HashSet<int> { 1, 2, 5, 13, 14 }; 
int x = 1; 
if (numbers.Contains(x)) 
{ 
    Console.WriteLine("Contains!"); 
} 
Các vấn đề liên quan