【问题标题】:How to exert boolean operator in Arrays c#?如何在 Arrays c# 中应用布尔运算符?
【发布时间】:2023-03-07 09:13:01
【问题描述】:

如何在数组 c# 中应用布尔运算符。 我有三个相同大小的 3D 数组,我想对两个数组应用布尔运算符并将结果保存在 array3 中。 例如:

int[, ,] array1 = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, 
                             { { 7, 8, 9 }, { 10, 11, 12 } } };
int[, ,] array2 = new int[,,] { { { 1, 1, 1 }, { 0, 0, 0 } }, 
                             { { 0, 0, 0 }, { 0, 0, 0 } } };
int [, ,] array3 = new int[4,3]; 
result = array1 (AND operator) array2;

预期结果:

array3 = { { 1, 2, 3 }, { 0, 0, 0 } },{ { 0, 0, 0 }, { 0, 0, 0 } };

我的问题是有什么方法可以在不访问数组元素的情况下对两个数组实现布尔运算?

感谢您的提前。

【问题讨论】:

  • 你是说你想用第二个数组屏蔽第一个数组吗?
  • 是的,掩蔽(不是很好地表达了问题)
  • &&是逻辑运算符,它要么返回true,要么返回false,除了3 && 1,你如何返回3?!
  • without accessing array elements? 你想在不访问数组元素的情况下比较 2 数组的元素吗?你是在问一个内置的库函数还是一个技巧问题?

标签: c# .net arrays boolean


【解决方案1】:

好消息是从框架 4.0 开始有 Zip method:

Enumerable.Zip 方法应用指定的 作用于两个序列的对应元素,其中 产生一系列结果。

对于一维数组,这很简单:

        int[] array1 = new int[] { 1, 2, 3 };
        int[] array2 = new int[] { 0, 1, 0 };

        var zipped = array1.Zip(array2, (first, second) => second == 0 ? 0 : first);
        //zipped = {0, 2, 0}

坏消息是多维数组不实现 IEnumerable,但您可以将 Zip 与锯齿状数组一起使用。你可以试试这样的:

        int[][] jagged1 = new int[][]
                {
                    new int[] {1,2,3},
                    new int[] {4,5,6},
                    new int[] {7,8,9}
                };

        int[][] jagged2 = new int[][]
                {
                    new int[] {1,1,1},
                    new int[] {0,0,0},
                    new int[] {0,0,0}
                };

        var zipped = jagged1.Zip(jagged2, (firstArray, secondArray)                             
                        => firstArray.Zip(secondArray, 
                              (first, second) => second == 0 ? 0 : first)
                     );

        //zipped = {{1,2,3}, {0,0,0}, {0,0,0}}

【讨论】:

    【解决方案2】:

    我不完全确定你的意思,但是:

    int[,,] array3 = new int[array1.GetLength(0), array1.GetLength(1), array1.GetLength(2)];
    
    for (int x = 0; x < array1.GetLength(0); ++x)
        for (int y = 0; y < array1.GetLength(1); ++y)
            for (int z = 0; z < array1.GetLength(2); ++z)
                array3[x, y, z] = (array2[x, y, z] != 0) ? array1[x, y, z] : 0;
    

    如果 array2[x,y,z] 不为零,则将 array3[x,y,z] 设置为 array1[x,y,z] 否则将 array3[x,y,z] 设置为 0。

    这是你的意思吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2010-09-06
      • 1970-01-01
      • 2014-05-26
      • 2017-02-24
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多