【问题标题】:Hot to logic compare a bool array with itself for a single bool result?逻辑热比较布尔数组与自身以获得单个布尔结果?
【发布时间】:2018-04-03 14:00:30
【问题描述】:

我有一个如下所示的数组:

bool[] array = new bool[4] { true, false, true, true } ;

我想在这个数组的所有元素之间进行 AND/OR 比较,例如:

AND 示例:真与假与真与真

所以我可以得到最终结果,这在上面的例子中是错误的,或者:

OR 示例:真或假或真或真

在上面的例子中,这对我来说是正确的。

数组中是否有任何内置方法可以让我这样做?还是我必须在所有元素之间进行迭代并一一比较?

【问题讨论】:

    标签: c# .net arrays


    【解决方案1】:

    根据 cmets 和其他答案,您可以将 LINQ 用于这两者。 (尽管您不必这样做;farbiondriven 的答案绝对可以正常工作,尽管它不太通用,因为 LINQ 解决方案可以处理 任何 IEnumerable<bool>。)

    Any 带有恒等投影将检测 any 元素是否为 true,这与对所有元素执行逻辑 OR 的结果相同。

    All 带有恒等投影将检测 所有 元素是否为 true,这与对所有元素执行逻辑 AND 的结果相同:

    bool orResult = array.Any(x => x);
    bool andResult = array.All(x => x);
    

    这两个都会短路:如果第一个元素是true,那么Any 不会费心查看后面的元素,因为结果肯定是true。同样,如果第一个元素是false,那么All 不会费心查看后面的元素,因为结果肯定是false.

    但是,您可能需要考虑您希望空数组的结果是什么。 Any() 将在空序列上返回 false,而 All 将在空序列上返回 true。这可能是也可能不是您所期望或需要的。

    【讨论】:

      【解决方案2】:

      这可以通过 linq 完成:

      var all = array.All(x => x);
      var or = array.Any(x => x);
      

      【讨论】:

        【解决方案3】:

        使用 Linq Aggregate 和二进制 &| 操作的方法

        bool[] array = new bool[4] { true, false, true, true } ;
        bool resultAnd = array.Aggregate((a, b) => a & b); // AND
        bool resultOr = array.Aggregate((a, b) => a | b); //OR
        bool resultXor = array.Aggregate((a, b) => a ^ b); //XOR
        

        【讨论】:

        • 请注意,这不会短路,而AnyAll 会。
        • 虽然我更喜欢 Patrick 和 Richej 的回答,但如果不想为了实现相同的目标而导入库,那么这个是一个很好的选择。感谢您的回复!
        【解决方案4】:

        如果可能需要无 LinQ 解决方案:

        public static bool Or(IList<bool> bList)
        {
            return bList.Contains(true);
        }
        
        public static bool And(IList<bool> bList)
        {
            return !bList.Contains(false);
        }
        

        【讨论】:

        • 使用 LINQ - 它正在调用 Enumerable.Contains。你是对的,你不需要 LINQ,但是这个解决方案恰好使用它。
        • 现在不使用 LINQ - 但不适用于数组。 IList&lt;T&gt; 会做到的 :)
        • 你是对的!以防万一有人需要旧版本的 .NET。
        【解决方案5】:

        数组中是否有任何内置方法可以让我这样做?

        回答:是的。 System.Array Class中有静态方法可以使用。

        例如Array.IndexOf Method (T[], T):

        bool andResult = !(Array.IndexOf<bool>(array, false) > -1);
        bool orResult = Array.IndexOf<bool>(array, true) > -1;
        

        但是,您需要定义如何处理空数组的边缘情况。

        Array 类中还有其他方法也可用于构造逻辑。我会把那个练习留给你。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-16
          • 2018-06-14
          • 1970-01-01
          • 2016-05-05
          • 2016-03-11
          • 1970-01-01
          相关资源
          最近更新 更多