数字在二维阵列中显示的次数


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个单元格组成的2D数组,每个单元格都有3个属性:[0]是X,[1]是Y,[2]是活动与否,0表示非活动,1表示活动。

我正在尝试使用NumOfActiveCells((检查有多少单元格处于活动状态,尽管它有效,但我仍然希望看看是否有一种更短甚至是单行的方法来做到这一点。也许是使用LINQ的东西?

编辑:更改为"更好"=>"更短"。我解释错了。我确实同意我的代码很好,但我只是想看看是否有更短的方法,谢谢你的回复!

虽然int[,]只实现IEnumerable(非通用版本(,但您可以Cast<int>使其成为IEnumerable<int>。然后您可以使用所有常见的LINQ操作。

所需的所有元素在原始二维数组中的索引都为[x, 2](第三列(。由于IEnumerable<int>表示1D序列,因此2D阵列将被平坦化,并且索引[x, 2]将被映射到3x + 2。因此,要检查1D序列中的元素e是否在原始2D阵列的第三列,我们只需要看看它在1D序列的索引是否可以表示为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的"循环计数器"从0到8,并计算与x == 1匹配的元素。