У меня есть массив, который выглядит так:
int[,] figureL = {{0, 1, 0},
{0, 1, 0},
{0, 1, 1}};
Как я могу получить индексы всех чисел, равных 1
? Так что не только одного числа, а всего числа 1's
.
🤔 А знаете ли вы, что...
C# поддерживает асинхронное и параллельное программирование с помощью ключевых слов async и await.
Для этого вам просто нужно перебрать оба измерения массива и посмотреть, равно ли значение в текущем индексе 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