数字在二维数组中出现的次数
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
.
的元素
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
.