数字在二维数组中出现的次数

Number of times number appears in a 2D array

class Board
{
    int[,] ActiveXY = new int[9, 3];
    private int NumOfActiveCells()
    {     
        int counter = 0;
        for (int i = 0; i < 9; i++)
        {
            if (ActiveXY[i, 2] == 1) counter++;
        }
        return counter;
    }
...

在此代码中,ActiveXY 是一​​个包含 9 个单元格的二维数组,每个单元格具有 3 个属性:[0] 是 X,[1] 是 Y,[2] 是否处于活动状态,为 0不活动,1 表示活动。

我正在尝试使用 NumOfActiveCells() 检查有多少单元格处于活动状态,虽然它有效,但我仍然希望看看是否有更短甚至单行的方法来执行此操作。 也许使用 LINQ?

编辑:更改 "Better" => "Shorter"。我错误地解释了自己。我同意我的代码很好,但我只是想看看是否有更短的方法,谢谢您的回复!

尽管 int[,] 仅实现 IEnumerable(非通用版本),您可以 Cast<int> 使其成为 IEnumerable<int>。然后就可以使用所有常用的LINQ操作了。

您想要的所有元素在原始二维数组中的索引为 [x, 2](第三列)。由于 IEnumerable<int> 表示一维序列,因此二维数组将被展平,索引 [x, 2] 将映射到 3x + 2。所以要检查一维序列中的元素e是否在原二维数组的第三列,我们只需要看它在一维序列中的索引是否可以表示为3x + 2.

int total1s = ActiveXY.Cast<int>().Where((e, index) => e == 1 && (index + 1) % 3 == 0).Count();

编辑:我只是想到了一个更具可读性的解决方案:

int total1s = Enumerable.Range(0, 9).Select(i => ActiveXY[i, 2]).Count(x => x == 1);

这就像您的 for 循环一样工作,i 的 "loop counter" 从 0 到 8,并计算匹配 x == 1.

的元素