2013-04-09 31 views
8

Tôi có 3 boolean trên mã của tôi (C#) và thuộc tính int32 phụ thuộc vào booleans là truefalse. Whats cách tốt nhất để thực hiện điều này theo một cách khác hơn nếu báo cáo thích:Cách tốt nhất để kiểm tra nhiều điều kiện boolean trong C# nếu phát biểu

if(a && b && !c) 
    d = 1; 
if(a && !b && !c) 
    d = 2; 
//etc.. ect... 

EDIT: The 3 boolean phải có tất cả các kết hợp có thể thiết lập giá trị int32.

EDIT 2: Giá trị của "d" có thể giống nhau cho hai phép so sánh boolean khác nhau.

+4

Nếu luôn có đúng ba phép toán luận, bạn có thể xây dựng một bảng trước thời hạn và sau đó chỉ cần tìm kiếm các mục cụ thể bằng cách sử dụng các phép toán luận như phím. – cdhowie

+0

Một mảng các số nguyên và sau đó 3 boolean được sử dụng như các bit đơn để lập chỉ mục mục nhập thích hợp. Loại đại diện nhỏ gọn của cây nhị phân. –

+0

Để EDIT: câu trả lời của tôi cho thấy làm thế nào để tính toán một 'chỉ số kết hợp' từ các điều kiện cấu thành – sehe

Trả lời

25

Nó là tốt hơn để nắm bắt mục đích của hoạt động thay vì một cách rõ ràng kiểm tra các giá trị boolean .

Ví dụ:

public void Check() 
{ 
    if (HasOrdered()) 
    { 
     // do logic 
    } 
} 

private bool HasOrdered() 
{ 
    return a && !b && !c; 
} 

private bool HasBooked() 
{ 
    return a && b && !c; 
} 
+0

+1 Rất đồng ý, tùy theo cách nào nhỏ gọn nhất để kiểm tra các điều kiện chúng ta không nên quên tên miền. –

+0

+1 tại đây. Tôi vẫn đăng câu trả lời của tôi bởi vì nó không rõ ràng từ OP rằng kịch bản của mình vay chính nó cho 'tên miền mô tả' – sehe

+1

Nếu anh ta muốn làm cho mã terse loại thất bại mục đích – SamFisher83

2

Bạn có thể làm những gợi ý bảng tra cứu do @Adriano, giả sử bạn đã lookup_table đầy giá trị cho chỉ số [0..8):

var index = new [] { a,b,c }.Aggregate(0, (a,i) => return 2*a + (i?1:0)); 

int d = lookup_table[index]; 

Sửa Các EDIT của câu hỏi thực hiện điều này không liên quan: D có nghĩa là gì?

Nếu đó là số lượng các giá trị sai (có thể từ mẫu mã), làm cho nó

int d = new [] { a,b,c }.Count(b => !b); 

2

Tôi nghĩ rằng những gì bạn làm gì bây giờ là hoàn toàn tốt đẹp và bất kỳ giải pháp khác sẽ xuống đến sở thích.

Tùy chọn của tôi, nơi áp dụng sẽ là tách séc ra nếu có thể.

if (!a) 
    return; 
if (!b) 
    return; 
if (!c) 
    return; 

này sẽ hữu ích trong trường hợp bạn cần phải kiểm tra điều kiện tiên quyết nhất định trước khi ban hành một chức năng, như thế nào nếu người dùng đã đăng nhập, nếu một tham số tồn tại và là trong bối cảnh phải, cùng với các mặt hàng khác.

Giống như tôi đã nói điều này có thể không áp dụng nhưng tôi chỉ muốn bày tỏ ý kiến ​​của tôi

0

tôi không thấy bất cứ điều gì sai với cách bạn đang làm việc đó, nhưng nếu đầu ra là như nhau cho nhiều điều kiện bạn có thể có thể đơn giản hóa nếu bằng cách tạo bảng chân lý và đơn giản hóa các điều kiện.

Ví dụ, nếu d nên 0bất cứ lúc nàoa là sai bạn có thể đơn giản hóa để:

if(a) 
    if(b && !c) 
     d = 1; 
    if(!b && !c) 
     d = 2; 
    ... 
else 
    d = 0; 

Hoặc nếu có một số mô hình toán học (ví dụ a, bc đại diện cho ba chữ số của một số nhị phân) thì bạn có thể làm số học bit.

Tuy nhiên, nếu bạn có 8 biệt kết quả (một cho mỗi sự kết hợp của a, bc) sau đó phương pháp của bạn là tốt.

9

Bạn có thể sử dụng bản đồ Karnaugh để giảm phương trình và có ít ifs hơn.

https://en.wikipedia.org/wiki/Karnaugh_map

+0

Đây là giải pháp tốt nhất mà tôi bị sốc vì vậy nhiều người không đề xuất điều này. –

+1

@Ramhound nhiều người sẽ chỉ đơn giản là thích viết logic _as nó arises_, không phải như thế nào nó kết hợp _effectively_, cuối cùng; Bản đồ K tập trung vào kết quả _only_ và loại bỏ tàn nhẫn bất kỳ thông tin nào từ đầu vào không ảnh hưởng đến kết quả nữa. Do đó, thông tin này không còn rõ ràng từ nguồn. Hene, nguồn không còn là sự phản ánh các yêu cầu chức năng nữa. Đó là _harder_ để chứng minh đúng, không _easier_. Thậm chí khó khăn hơn để duy trì (sửa đổi). Thay vào đó, thông thường bạn nên để trình biên dịch lo lắng về việc tối ưu hóa (điều này có thể xảy ra ngay cả sau khi nội tuyến). – sehe

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