【问题标题】:Number of times number appears in a 2D array数字出现在二维数组中的次数
【发布时间】:2020-05-02 08:04:02
【问题描述】:
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 的东西?

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

【问题讨论】:

  • “更好”是一个有争议的概念。您似乎认为单线比多线更好,但有些人不同意。对我来说,通常有两件事很重要,我试图在它们之间找到平衡:可读性和速度。按照这些标准,您的代码非常好。它易于阅读,您只能访问您需要的数组部分(活动标志),因此它也适用于速度。我不再认为一切都需要花哨的单行代码,并且对可读且快速的代码感到满意。
  • 感谢您的评论,我 100% 同意您的意见。我修正了我的解释。

标签: c# linq multidimensional-array counter


【解决方案1】:

虽然int[,] 只实现了IEnumerable(非泛型版本),但您可以通过Cast&lt;int&gt; 使其成为IEnumerable&lt;int&gt;。然后就可以使用所有常用的 LINQ 操作了。

您想要的所有元素在原始二维数组中的索引为[x, 2](第三列)。由于IEnumerable&lt;int&gt; 代表一维序列,二维数组将被展平,索引[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 的“循环计数器”从 0 到 8,并计算与 x == 1 匹配的元素。

【讨论】:

  • 很好的解决方案,但当前的 OP 代码更清晰易读,IMO :)
  • @PavelAnikhouski 我不知道我为什么首先想到这样一个晦涩难懂的解决方案......我添加了一个更“正统”的(?)一个......
  • @Sweeper 感谢您的快速回答,我低估了这个社区。谢谢!
猜你喜欢
  • 2021-09-02
  • 2023-04-02
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2020-09-23
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多