Как я могу получить все индексы числа 1 в двумерном массиве?

У меня есть массив, который выглядит так:

int[,] figureL = {{0, 1, 0},
                  {0, 1, 0},
                  {0, 1, 1}};

Как я могу получить индексы всех чисел, равных 1? Так что не только одного числа, а всего числа 1's.

🤔 А знаете ли вы, что...
C# поддерживает асинхронное и параллельное программирование с помощью ключевых слов async и await.


58
3

Ответы:

Для этого вам просто нужно перебрать оба измерения массива и посмотреть, равно ли значение в текущем индексе 1.

Для вашего двумерного массива, который вы определили здесь, вам нужно найти Rank (который показывает, сколько измерений в массиве). Вам также нужно будет найти верхнюю границу каждого из этих измерений, вызвав figureL.GetUpperBound(rank), где rank — текущее измерение. Затем вы можете использовать эту информацию для создания циклов, которые будут перебирать вашу структуру данных.

Вот пример перечисления двумерного массива с использованием приведенного выше синтаксиса:

        private void Test()
        {
            int[,] figureL= {
                {0,1,0 },
                {0,1,0 },
                {0,1,1 }
            };

            Parse(figureL);
        }

        private void Parse(int[,] input)
        {
            var dimension1 = input.GetUpperBound(0);
            var dimension2 = input.GetUpperBound(1);

            for (int i = 0; i <= dimension1; i++)
            {
                for (int j = 0; j <= dimension2; j++)
                {
                    if (input[i, j] == 1)
                        Console.WriteLine($"[{i},{j}]");
                }
            }
        }

Конечно, если вы имеете дело с массивами с более чем двумя измерениями, вам придется изменить это, но в нынешнем виде этого должно быть достаточно, чтобы начать работу с многомерными массивами.


Решено

Как насчет такого:

int[,] matrix =
    {{0, 1, 0},
     {0, 1, 0},
     {0, 1, 1}};

for (var i = 0; i < matrix.GetLength(0); i++)
{
    for (var j = 0; j < matrix.GetLength(1); j++)
    {
        if (matrix[i, j] == 1)
        {
            Debug.WriteLine($"index [{i}, {j}] is 1");
        }
    }
}

Вызовы matrix.GetLength(int) дают вам размер двух измерений (нулевого и первого).

Вывод выглядит так:

index [0, 1] is 1
index [1, 1] is 1
index [2, 1] is 1
index [2, 2] is 1

Вы можете написать LINQ-подобный метод расширения, который поможет вам найти произвольные элементы в массиве:

public static IEnumerable<(int,int)> FindIndices<T>(this T[,] source, Func<T,bool> predicate)
    {
        for (int i = 0; i < source.GetLength(0); i++)
        {
            for (int j = 0; j < source.GetLength(1); j++)
            {
                if (predicate.Invoke(source[i,j]))
                {
                     yield return (i,j);
                }
            }
        }
    }

Он вернет кортежи индексов элементов, которые соответствуют условиям, указанным в predicate. Использование

var indices = figureL.FindIndices(x => x == 1);

Онлайн-демонстрация: https://dotnetfiddle.net/tdcwa4