2012-12-18 22 views
14

Với mã này:Làm thế nào tôi có thể trả về một giá trị bool từ rất nhiều bool nullable?

private bool AtLeastOnePlatypusChecked() 
{ 
    return ((ckbx1.IsChecked) || 
      (ckbx2.IsChecked) || 
      (ckbx3.IsChecked) || 
      (ckbx4.IsChecked)); 
} 

... Tôi đứng sững lại trong các bài hát của tôi với

Operator '||' cannot be applied to operands of type 'bool?' and 'bool? 

Vì vậy, làm thế nào để thực hiện điều này?

+0

Trong trường hợp này, bốn. –

+1

http://www.merriam-webster.com/dictionary/plethora –

Trả lời

31

Bạn có thể chuỗi lại với nhau | s, sử dụng toán tử null-coalescing ở cuối:

return (ckbx1.IsChecked | cxbx2.IsChecked | cxbx3.IsChecked | cxbx4.IsChecked) ?? false; 

Nhà điều hành được nâng lên | trả về true nếu eith toán hạng er là true, false nếu cả hai toán hạng là falsenull nếu toán hạng là null và toán hạng kia không phải là true.

Nó không phải là ngắn mạch, nhưng tôi không nghĩ rằng đó sẽ là một vấn đề cho bạn trong trường hợp này.

Cách khác - và có thể mở rộng hơn - đặt hộp kiểm vào một bộ sưu tập thuộc loại nào đó. Sau đó, bạn chỉ có thể sử dụng:

return checkboxes.Any(cb => cb.IsChecked ?? false); 
+0

Cuối cùng tôi biết "nâng" nghĩa là gì. Tôi gặp phải thuật ngữ này khi làm việc với cây biểu thức. –

+0

Tôi cũng tò mò về thuật ngữ đó, nhưng có vẻ như [Jon đã trả lời câu hỏi đó] (http://stackoverflow.com/questions/3370110/what-are-lifted-operators) –

+0

Tôi đã bình chọn lại cho điều này . Wow đó là sexy. –

4

Bạn có thể sử dụng như sau:

(ckbx1.IsChecked.HasValue && ckbx1.IsChecked.Value) 
+0

Bằng cách nào đó điều này "cảm thấy" đẹp hơn .. –

+2

Nếu '||' là toán tử '&&'? Nếu 'cbx1.IsChecked.HasValue' là' false' thì sẽ có 'Null Reference' khi nhận' ckbx1.IsChecked.Value'. –

11

Hãy thử:

return ((ckbx1.IsChecked ?? false) || 
     (ckbx2.IsChecked ?? false) || 
     ... 
+0

Darnit, đánh tôi với nó! –

6

Tôi giả định rằng nếu null, sau đó nó sẽ là sai, bạn có thể sử dụng ?? nhà điều hành.

private bool AtLeastOnePlatypusChecked() 
{ 
     return ((ckbx1.IsChecked ?? false) || 
     (ckbx2.IsChecked ?? false) || 
     (ckbx3.IsChecked ?? false) || 
     (ckbx4.IsChecked ?? false)); 
} 
2

Sử dụng ?? toán tử bên trong phương thức của bạn;

private bool AtLeastOnePlatypusChecked() 
{ 
return ((ckbx1.IsChecked ?? false) || 
     (ckbx2.IsChecked ?? false) || 
     (ckbx3.IsChecked ?? false) || 
     (ckbx4.IsChecked ?? false) 
} 
5

Bạn có thể sử dụng GetValueOrDefault() để có được một trong hai giá trị, hoặc false.

private bool AtLeastOnePlatypusChecked() 
{ 
    return ((ckbx1.IsChecked.GetValueOrDefault()) || 
      (ckbx2.IsChecked.GetValueOrDefault()) || 
      (ckbx3.IsChecked.GetValueOrDefault()) || 
      (ckbx4.IsChecked.GetValueOrDefault())); 
}