Как я могу сравнить элементы в массиве зубчатых?
Я хотел бы создать зубчатый массив определенного типа, а затем создать другой массив из этого на основе сравнения между двумя элементами в массиве.
Например:
int[][] arr = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22},
new int[] {0,2,4,6}
};
int[][] arrResult = new int[arr.GetUpperBound(0)][];
for (int i = 0; i < arr.GetUpperBound(0); i++)
{
for (int j = 0; j < arr[i].Length; j++)
{
arrResult[i][j] = arr[i][j] + arr[i + 1][j];
}
}
Я не уверен, как сказать, что если i+1 не существует, тогда пропустите это сравнение. Или есть лучший способ сделать это?
РЕДАКТИРОВАТЬ
Сравнивая, я имею в виду, что я хочу получить доступ к двум элементам из массива, которые следуют друг за другом в столбце, что-то сделать с ними и создать запись в новый массив (с той же структурой) из продукта.
2 ответа
Вы не сравниваете, а добавляете. Так что не понятно, что ты действительно хочешь делать.
Если вы хотите выполнить операцию с соответствующими элементами в двух последовательных строках, вы можете сделать это только для минимальной длины двух строк
for (int i = 0; i < arr.Length - 1); i++) {
for (int j = 0; j < arr[i].Length && j < arr[i + 1].Length; j++) {
arrResult[i][j] = arr[i][j] + arr[i + 1][j];
}
}
Во-первых, вам не нужно GetUpperBound()
Вот. Это полезно для многомерных массивов (или массивов, не основанных на 0), а не для зубчатых массивов. Вместо этого вы можете использовать Length - 1
,
Во-вторых, вам нужно создать массивы, которым вы назначаете. new int[count][]
не создает вложенные массивы, поэтому ваш код NullReferenceException
,
В-третьих, вы хотите ограничить индекс (и размер создаваемого массива) меньшим из двух размеров. Ты можешь использовать Math.Min()
для этого.
Собрать вместе:
int[][] arrResult = new int[arr.Length - 1][];
for (int i = 0; i < arr.Length - 1; i++)
{
int length = Math.Min(arr[i].Length, arr[i+1].Length);
arrResult[i] = new int[length];
for (int j = 0; j < length; j++)
{
arrResult[i][j] = arr[i][j] + arr[i + 1][j];
}
}
В-четвертых, в качестве альтернативы вы могли бы использовать LINQ Zip()
(он позаботится об ограничении размера результата более коротким массивом):
int[][] arrResult = new int[arr.Length - 1][];
for (int i = 0; i < arr.Length - 1; i++)
{
arrResult[i] = arr[i].Zip(arr[i+1], (a, b) => a + b).ToArray();
}