2009-08-27 51 views
11

Hey tất cả, tìm cách để giảm mã trên C# của tôi nếu báo cáo như có một số yếu tố lặp đi lặp lại và đã tự hỏi nếu một giải pháp tông đơ là có thể.IF Tuyên bố nhiều điều kiện, cùng một tuyên bố

Tôi hiện có 2 câu lệnh nếu cần thực hiện một câu lệnh giống nhau, tuy nhiên biến duy nhất là điều kiện bổ sung trên câu lệnh if khi hộp kiểm không được chọn. Im chỉ tự hỏi nếu có một cách để làm cho nó trở thành một tuyên bố hoặc làm cho biến điều kiện chuỗi, heres phiên bản nén của các mã:

if (checkbox.checked) 
    { 
    if (columnname != a && columnname != b && columnname != c) 
    { 
     "statement 1" 
    } 
    } 
else 
    { 
    if (columnname != a && columnname != b && columnname != c 
     && columnname != A2) 
    { 
     "statement 1" 
    } 
    } 

của nó như tôi cần phải chạy một câu lệnh if trong các điều kiện của if tuyên bố nếu điều đó có ý nghĩa, như hình thức psuedo này:

if (columnname != a 
    && columnname != b 
    && columnname != c 
    && if(checkbox.checked{columnname != A2}) 
+0

BTW - t ông cùng một câu trả lời hoạt động trong C, C++ và Java. –

Trả lời

33
if (columnname != a 
    && columnname != b 
    && columnname != c 
    && (checkbox.checked || columnname != A2)) 
{ 
    "statement 1" 
} 

nên làm các trick.

+3

thường là khi điều kiện của tôi trong một tuyên bố nếu nhiều hơn ba, tôi trích xuất chúng vào một phương pháp riêng tư chỉ để làm cho nó rõ ràng tình trạng là gì –

10
if (columnname != a && columnname != b && columnname != c 
     && (columnname != A2 || checkbox.checked)) 
    { 
     "statement 1" 
    } 
0
if (checkbox.checked && columnname != a && columnname != b && columnname != c) 
    { 
     "statement 1" 
    } 
else if (columnname != a && columnname != b && columnname != c 
     && columnname != A2) 
    { 
     "statement 1" 
    } 

là một cách để đơn giản hóa một chút.

3

không Đây có phải là giống nhau:

if ((checkbox.checked || columnname != A2) && 
     columnname != a && columnname != b && columnname != c) 
    { 
     "statement 1" 
    } 
2

Bạn cũng có thể làm điều này nếu bạn nghĩ rằng nó rõ ràng hơn:

if (columnname != a 
    && columnname != b 
    && columnname != c 
{ 
    if (checkbox.checked || columnname != A2) 
    { 
     "statement 1" 
    } 
} 
1

Tôi nghĩ agileguy có câu trả lời chính xác, nhưng tôi muốn thêm điều đó cho các tình huống khó khăn hơn có một vài chiến lược tôi thực hiện để giải quyết vấn đề. Đầu tiên là sử dụng truth table. Nếu bạn "bảng chân lý" của Google, bạn sẽ chạy trên một số ví dụ liên quan trực tiếp đến khoa học lập trình và khoa học máy tính.

Một chiến lược khác mà tôi thực hiện là sử dụng chức năng ẩn danh để gói gọn logic chung giữa các điều kiện khác nhau. Tạo nó ngay trước khối if, sau đó sử dụng nó khi cần thiết. Điều này dường như tạo mã dễ đọc hơn và dễ bảo trì hơn.

6

tôi luôn cố gắng yếu tố ra biểu thức boolean phức tạp vào các biến có ý nghĩa (bạn có thể có thể nghĩ ra tên tốt hơn dựa trên những gì các cột này được sử dụng cho):

bool notColumnsABC = (columnname != a && columnname != b && columnname != c); 
bool notColumnA2OrBoxIsChecked = (columnname != A2 || checkbox.checked); 

if ( notColumnsABC 
    && notColumnA2OrBoxIsChecked) 
    { 
     "statement 1" 
    } 
3

câu hỏi Khá cũ nhưng kiểm tra này cho một hơn cách nhóm các điều kiện kiểm tra:

private bool IsColumn(string col, params string[] names) => names.Any(n => n == col); 

sử dụng:

private void CheckColumn() 
{ 
    if(!IsColumn(ColName, "Column A", "Column B", "Column C")) 
    { 
    //not A B C column 
    } 

}