\begingroup

有没有更清晰的方法来识别boola 中的 sList<bool>是全部为真、全部为假还是混合为真?

我通过拥有一个可空值bool?然后执行以下操作来完成此操作:

bool? result;
    
if (ls.TrueForAll(x => x == true))
{
    result = true;
}
else if (ls.TrueForAll(x => x == false))
{
    result = false;
}
else
{
    result = null;
}

然而,这需要迭代列表两次,并且感觉像是一种稍微冗长的方法,并且感觉像是一个可能已经解决的问题。

我不太担心性能,因为在我的代码中这种情况并不经常发生,所以我更感兴趣的是采用一种更简洁的方式来实现这一点。

这是一个带有设置/演示的 dotnetfiddle:

\endgroup

4

  • \begingroup
    弹出第一个(如果可能的话!)并且剩余的列表必须全部是第一个元素。
    \endgroup


    – 


  • 1
    \begingroup
    当所有值都是true 所有值都是时,您想返回什么false– 例如对于空列表?
    \endgroup


    – 

  • 1
    \begingroup
    该列表实际上并未迭代两次,因为 TrueForAll 方法的“当委托对任何元素返回 false 时,处理就会停止”。因此在其中一个分支中,处理在第一个元素之后停止。
    \endgroup


    – 

  • \begingroup
    ..
    \endgroup


    – 


最佳答案
2

\begingroup

您需要做的就是:

  1. 获取第一个布尔数组组件b1b1b_1
  2. 迭代数组其余部分b2bnb2bnb_2, \ldots, b_n
  3. 如果 (2) 中的某个数组分量不匹配b1b1b_1, 返回null
  4. 否则,返回b1b1b_1

我想到了这个假设的代码:

static bool? GetListBool(bool[] boolArray)
{
    const bool selector = boolArray[0];

    for (int i = 1; i < boolArray.Length; i++) 
    {
        if (boolArray[i] != selector) 
        {
            return null;
        }
    }

    return selector;
}

\endgroup

5

  • \begingroup
    是的,就是这样。早该想到这一点的!
    \endgroup


    – 

  • 2
    \begingroup
    当你传递一个空数组时会发生什么?
    \endgroup


    – 

  • 1
    \begingroup
    @Bergi 数组索引越界异常,我知道。两个选项:(1) 返回null,或者不捕获并重新抛出。
    \endgroup


    – 

  • \begingroup
    const bool selector = boolArray[0];给出“常量初始化程序必须是编译时常量”错误。删除const
    \endgroup


    – 

  • \begingroup
    @PiersMyers 我在回答中提到我的代码是假设的。我实际上不做 C#。
    \endgroup


    – 

\begingroup

它可能就这么简单(正如 Joop Eggen 所建议的那样):

return list.All(x => x == list[0]) ? list[0] : null;

更新 #1

上述代码没有处理集合为空的情况。由于问题中没有提到针对这种情况的任何具体要求,因此如何处理取决于 OP。

将其视为null

return list.Any() && list.All(x => x == list[0]) ? list[0] : null;

将其视为false

return list.Any() 
    ? list.All(x => x == list[0]) ? list[0] : null
    : false;

将其视为true

return list.Any() 
    ? list.All(x => x == list[0]) ? list[0] : null
    : true;

引发自定义异常

return list.Any() 
    ? list.All(x => x == list[0]) ? list[0] : null
    : throw new CustomException();

\endgroup

9

  • \begingroup
    很好,按照原始问题的方式处理空列表。
    \endgroup


    – 

  • 1
    \begingroup
    @JoopEggen YeppAll是安全的。list[0]不是。
    \endgroup


    – 


  • 1
    \begingroup
    这也是一个很好的解决方案,谢谢。
    \endgroup


    – 

  • 1
    \begingroup
    @JollyJoker 由于问题没有指定如何处理空集合的任何要求,我认为由 OP 决定如何实现该部分。
    \endgroup


    – 

  • 1
    \begingroup
    @PeterCsala 我想这意味着没有这个的原始版本list.Any()会更好
    \endgroup


    –