如何从大量可为空的布尔值中返回布尔值?

Posted

技术标签:

【中文标题】如何从大量可为空的布尔值中返回布尔值?【英文标题】:How can I return a bool value from a plethora of nullable bools? 【发布时间】:2012-12-06 04:48:32 【问题描述】:

使用此代码:

private bool AtLeastOnePlatypusChecked()

    return ((ckbx1.IsChecked) ||
            (ckbx2.IsChecked) ||
            (ckbx3.IsChecked) ||
            (ckbx4.IsChecked));

...我被

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

那么我该如何实现呢?

【问题讨论】:

merriam-webster.com/dictionary/plethora 【参考方案1】:

您可以使用以下内容:

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

【讨论】:

|| 应该是&& 运算符吗?如果cbx1.IsChecked.HasValuefalse,那么在获取ckbx1.IsChecked.Value 时会有一个Null Reference【参考方案2】:

试试:

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

【讨论】:

【参考方案3】:

您可以将|s 链接在一起,最后使用空合并运算符:

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

如果任一操作数为true,提升的| 运算符返回true,如果两个操作数均为false,则返回false,如果任一操作数为null 而另一个不是@,则返回null 987654333@.

这不是短路,但我认为在这种情况下这对你来说不是问题。

或者,更可扩展地,将复选框放入某种集合中。然后你可以使用:

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

【讨论】:

我终于知道“提升”是什么意思了。我在使用表达式树时遇到了这个术语。 我也对这个词很好奇,但它看起来像Jon has already answered that question 我相信 |操作数不使用短路评估,因此可能会对性能产生轻微影响,在本示例中可能可以忽略不计。 @OlivierJacot-Descombes:有关详细讨论,请参阅 blogs.msdn.com/b/ericlippert/archive/2007/06/27/…。此外,如果您对这个主题感兴趣,我将在本月晚些时候在我的新博客(ericlippert.com)中回到这个主题。 @JeppeStigNielsen:我在离开之前修复了 Roslyn 中的那个错误。我不再是“那些家伙”中的一员了。 :-)【参考方案4】:

我假设如果为 null,那么它将为 false,您可以使用 ??运算符。

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

【讨论】:

【参考方案5】:

在您的方法中使用?? 运算符;

private bool AtLeastOnePlatypusChecked()

return ((ckbx1.IsChecked ?? false) ||
        (ckbx2.IsChecked ?? false) ||
        (ckbx3.IsChecked ?? false) ||
        (ckbx4.IsChecked ?? false)

【讨论】:

【参考方案6】:

您可以使用GetValueOrDefault() 获取值或false

private bool AtLeastOnePlatypusChecked()

    return ((ckbx1.IsChecked.GetValueOrDefault()) ||
            (ckbx2.IsChecked.GetValueOrDefault()) ||
            (ckbx3.IsChecked.GetValueOrDefault()) ||
            (ckbx4.IsChecked.GetValueOrDefault()));

【讨论】:

以上是关于如何从大量可为空的布尔值中返回布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CheckBox 绑定到可为空的布尔类型 DbColumn?

可空布尔作为 C# 中的三态变量

如何从视图中的可为空列中驱动布尔字段? (SQL 服务器)

从布尔值中获取条形图?

如何从 ViewBag 中获取布尔值?

如何使单选按钮返回布尔值真/假而不是开/关