目前,我有一系列的可能性,我希望根据这些可能性来计算事实(逻辑xnor)。

var possibilities = new[] {
    new[] {0, 1, 1, 1, 1, 1, 1, 1},
    new[] {1, 1, 1, 1, 1, 1, 1, 0}
}

我正试图将其转换为一个布尔数组xnor(所有值都相等)
预期结果:
[ 0, 1, 1, 1, 1, 1, 1, 0 ]

可能性的数目是1。n.另一个例子是:
var possibilities = new[] {
    new[] {1, 1, 0, 1, 1, 0, 0, 0},
    new[] {1, 1, 0, 1, 1, 0, 0, 1},
    new[] {0, 1, 1, 0, 1, 1, 0, 1}
}

结果是:
[ 0, 1, 0, 0, 1, 0, 1, 0 ]

我最初的方法是开始构建嵌套循环并迭代每个可能性,抓取索引并进行比较,但是这看起来很“老套”,我相信有一种更简单(更好)的方法可以通过linq(但是我不太了解linq来编写它)或一种算法不需要难看的嵌套循环。
编辑1:使用了不正确的“逻辑”术语
正如下面的答案中所提到的,正确的逻辑不是事实上的,而是XNOR(所有列都相等)事实上,如果所有的值都相等,那么当我(如上所述)正在寻找1(或true)的结果时,如果所有的列都是0,则会产生0。

最佳答案

int size = possibilities[0].Length;
int i = 0;
var a = possibilities.SelectMany(x => x).GroupBy(x => i++ % size)
              .Select(x => x.Any(z => z == 0) ? 0 : 1);

使用循环:
int j = 0, size = possibilities[0].Length;
int[] result = new int[size];
for (int i = 0; i < size; i++)
{
     for (j = 0; j < possibilities.Length; j++)
         if (possibilities[j][i] == 0) { result[i] = 0; break; }
     if (j == possibilities.Length) result [i] = 1;
}

挪威:
int i = 0;
var a = possibilities.SelectMany(x => x).GroupBy(x => i++ % size)
            .Select(x => x.All(z => z == 0) || x.All(z => z == 1) ? 1 : 0);

带回路的XNOR:
int size = possibilities[0].Length;
int[] result = new int[size];
for (int i = 0; i < size; i++)
{
     int q = possibilities[0][i];
     for (j = 1; j < possibilities.Length; j++)
         if (possibilities[j][i] != q) { result[i] = 0; break; }
     if (j == possibilities.Length) result[i] = 1;
}

Live Demo

09-11 18:54