热门逻辑比较一个bool数组与其自身的单个bool结果?

时间:2018-04-03 14:00:31

标签: c# .net arrays

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

Bar

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

  

AND示例:true AND false AND true AND true

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

  

OR示例:true或false OR true或true

在上面的例子中,这会让我真实。

数组中有任何内置方法可以让我这样做吗?或者我是否应该在所有元素之间进行迭代并逐一进行比较?

5 个答案:

答案 0 :(得分:18)

根据评论和其他答案,您可以使用LINQ来实现这两个目标。 (尽管你不必这样做; farbiondriven的答案绝对可以正常使用,尽管LINQ解决方案可以处理任何 IEnumerable<bool>并不是一般目的。)

带有标识投影的

Any将检测任何元素是否为true,这与对所有元素执行逻辑OR的结果相同。< / p> 带有标识投影的

All将检测所有元素是否为true,这与在所有元素上执行逻辑AND的结果相同:< / p>

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

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

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

答案 1 :(得分:7)

这可以通过linq完成:

package mwe

import org.apache.spark.sql.api.java.UDF1

class SomeFun extends UDF1[Int, Int] {
  private var prop: Int = 0

  override def call(input: Int): Int = {
    if (prop == 0) {
      prop = input
    }
    prop + input
  }
}

答案 2 :(得分:2)

使用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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

  

数组中有任何内置方法允许我这样做吗?

答案:是的。 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 Class中还有其他方法也可用于构造逻辑。我会为你做这个练习。