Количество раз, которое число появляется в 2D массиве - PullRequest
1 голос
/ 02 мая 2020
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 (), и, хотя он работает, я все равно w sh, чтобы увидеть, есть ли более короткие или даже однострочный способ сделать это. Возможно, что-то с использованием LINQ?

EDIT: изменено "Better" => "Shorter". Я объяснил себя неправильно. Я согласен с тем, что у меня просто отличный код, но я просто хотел посмотреть, есть ли более короткий путь, спасибо за ответы!

1 Ответ

0 голосов
/ 02 мая 2020

Хотя int[,] реализует только IEnumerable (версия non-generi c), вы можете Cast<int> сделать его IEnumerable<int>. Затем вы можете использовать все обычные операции LINQ.

Все элементы, которые вы хотите, имеют индекс [x, 2] (третий столбец) в исходном двумерном массиве. Поскольку IEnumerable<int> представляет одномерную последовательность, двумерный массив будет сглажен, а индекс [x, 2] будет отображен на 3x + 2. Таким образом, чтобы проверить, находится ли элемент e в последовательности 1D в третьем столбце исходного двумерного массива, нам просто нужно посмотреть, можно ли выразить его индекс в последовательности 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);

Это работает так же, как вы для l oop, с "l oop counter" i, идущим от 0 до 8 и считая элементы, которые соответствуют x == 1.

...