С# присваивать 1 мерный массив синтаксису 2-мерного массива
Я хочу сделать что-то вроде:
object[] rowOfObjects = GetRow();//filled somewhere else
object[,] tableOfObjects = new object[10,10];
tableOfObjects[0] = rowOfObjects;
это как-то возможно и что такое синтаксис?
или мне нужно сделать это:
for (int i = 0; i < rowOfObjects.Length; i++)
{
tableOfObjects[0,i] = rowOfObjects[i];
}
и заполнить строку 2-мерных массивов с помощью цикла?
Спасибо
Ответы
Ответ 1
Нет, если вы используете двумерный массив, это невозможно. Вы должны скопировать каждый элемент.
Если вы используете зубчатый массив, он отлично работает:
// create array of arrays
object[][] tableOfObject = new object[10][];
// create arrays to put in the array of arrays
for (int i = 0; i < 10; i++) tableOfObject[i] = new object[10];
// get row as array
object[] rowOfObject = GetRow();
// put array in array of arrays
tableOfObjects[0] = rowOfObjects;
Если вы получаете все данные в виде строк, вам, конечно, не нужен цикл, который помещает массивы в массив массивов, так как вы все равно их замените.
Ответ 2
Если ваш массив является массивом типов значений, это возможно.
int[,] twoD = new int[2, 2] {
{0,1},
{2,3}
};
int[] oneD = new int[2]
{ 4, 5 };
int destRow = 1;
Buffer.BlockCopy(
oneD, // src
0, // srcOffset
twoD, // dst
destRow * twoD.GetLength(1) * sizeof(int), // dstOffset
oneD.Length * sizeof(int)); // count
// twoD now equals
// {0,1},
// {4,5}
Это невозможно с массивом объектов.
Примечание. Поскольку .net3.5 это будет работать только с массивом примитивов.
Ответ 3
если у меня есть массивы размера гигабайта, я бы сделал это в С++/CLI, играя с указателями, и делал только memcpy вместо того, чтобы иметь gazillion медленные операции индексации массивов с проверкой границ.
Ответ 4
Итак, что-то вроде:
public static object[] GetRow()
{
object[,] test = new object[10,10];
int a = 0;
object[] row = new object[10];
for(a = 0; a <= 10; a++)
{
row[a] = test[0, a];
}
return row;
}