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
匹配的元素。