Получение массива double [] из прямоугольного массива double [,]
Предположим, у вас есть массив вроде:
double[,] rectArray = new double[10,3];
Теперь вы хотите, чтобы fouth row в виде двойного [] массива из 3 элементов, не делая:
double[] fourthRow = new double[]{rectArray[3,0],
rectArray[3,1],
rectArray[3,2]};
Возможно ли это? Даже используя подход маршала. Какой-то подход?
Спасибо!
Ответы
Ответ 1
Вы можете использовать метод Buffer.BlockCopy
:
const int d1 = 10;
const int d2 = 3;
const int doubleSize = 8;
double[,] rectArray = new double[d1, d2];
double[] target = new double[d2];
int rowToGet = 3;
Buffer.BlockCopy(rectArray, doubleSize * d2 * rowToGet, target, 0, doubleSize * d2);
Ответ 2
LINQ на помощь:
var s = rectArray.Cast<double>().Skip(9).Take(3).ToArray();
Объяснение: Кастинг многомерного массива выравнивает его до одномерного массива. После этого все, что нам нужно сделать, это перейти к элементу, который нам нужен (4-й элемент в 2-D массиве разрешает пропустить (9)...) и взять из него 3 элемента).
Ответ 3
Почему бы не создать общий метод расширения?
public static T[] GetRow<T>(this T[,] input2DArray, int row) where T : IComparable
{
var width = input2DArray.GetLength(0);
var height = input2DArray.GetLength(1);
if (row >= height)
throw new IndexOutOfRangeException("Row Index Out of Range");
// Ensures the row requested is within the range of the 2-d array
var returnRow = new T[width];
for(var i = 0; i < width; i++)
returnRow[i] = input2DArray[i, row];
return returnRow;
}
Как и все, что вам нужно сделать, это:
array2D = new double[,];
// ... fill array here
var row = array2D.GetRow(4) // Implies getting 5th row of the 2-D Array
Это полезно, если вы пытаетесь связать методы после получения строки и могут быть полезны также с помощью команд LINQ.
Ответ 4
Вероятно, вы захотите использовать неровный массив. Это не массив из 10 на 3, а массив массивов.
Что-то вроде:
double[][] rectArray;
....
double [] rowArray = rectArray[3];
Есть много мест, где можно узнать больше о зубчатых массивах. Например Динамически созданный зубчатый прямоугольный массив
Ответ 5
Если вы должны использовать прямоугольный массив и просто хотите упростить синтаксис, вы можете использовать метод для получения строки следующим образом:
double[] fourthRow = GetRow(rectArray, 3);
public static T[] GetRow<T>(T[,] matrix, int row)
{
var columns = matrix.GetLength(1);
var array = new T[columns];
for (int i = 0; i < columns; ++i)
array[i] = matrix[row, i];
return array;
}
Ответ 6
Хотя это старая нить, добавление к Джозефу Стуртеванту может быть полезным. Его функция выйдет из строя, если первый столбец матрицы не равен нулю, но еще одно целое.
Это, например, всегда случай в случае извлечения данных из Excel, например
object[,] objects = null;
Excel.Range range = worksheet.get_Range("A1", "C5");
objects = range.Cells.Value; //columns start at 1, not at 0
Функция GetRow может быть изменена следующим образом:
public static T[] GetRow<T>(T[,] matrix, int row, int firstColumn)
{
var columns = matrix.GetLength(1);
var array = new T[columns];
for (int i = firstColumn; i < firstColumn + columns; ++i)
array[i-firstColumn] = matrix[row, i];
return array;
}