С # присвоить 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];
}

и заполнить строку двухмерных массивов с помощью цикла?

Спасибо


person m3ntat    schedule 08.07.2009    source источник


Ответы (5)


Нет, если вы используете двумерный массив, это невозможно. Вы должны скопировать каждый элемент.

Если вы используете зубчатый массив, он отлично работает:

// 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;

Если вы получаете все данные в виде строк, вам, конечно, не нужен цикл, который помещает массивы в массив массивов, поскольку вы все равно их просто замените.

person Guffa    schedule 08.07.2009
comment
Спасибо, в чем разница между: object [] [] tableOfObject = new object [10] [10]; и объект [,] tableOfObjects = новый объект [10,10]; Большое спасибо. - person m3ntat; 08.07.2009
comment
Объект [,] - это двумерный массив, он всегда прямоугольный (все строки одинаковой длины). Объект [] [] представляет собой зубчатый массив; массив массивов object []. Поскольку каждая строка сама по себе является массивом, они не должны быть одинаковой длины. - person Guffa; 08.07.2009
comment
Ах, в этом есть смысл. Спасибо, Гуффа. - person m3ntat; 08.07.2009
comment
Имейте в виду, что зубчатые массивы имеют более низкую производительность и занимают больше памяти, чем 2-мерные массивы (на самом деле они хранятся в памяти как 1-мерные массивы). Это может иметь значение в зависимости от того, что делает ваша программа. - person Blindy; 03.10.2009
comment
@Blindy: У вас это полностью наоборот. Неровные массивы работают лучше, чем 2D-массивы. Не уверен, кто вам это сказал, но это неправда. Вот хорошее описание тема - person Ed S.; 29.06.2012
comment
@Blindy: Еще лучше: stackoverflow.com/questions/468832/ - person Ed S.; 29.06.2012
comment
Почему голос против? Если вы не объясните, что вы считаете неправильным, это не улучшит ответ. - person Guffa; 18.04.2014

Если ваш массив представляет собой массив типов значений, это возможно.

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 это будет работать только с массивом примитивов.

person Matthew Finlay    schedule 03.10.2011

если бы у меня были массивы размером в гигабайты, я бы сделал это на C ++ / CLI, играя с указателями и выполняя просто memcpy вместо того, чтобы иметь множество медленных операций индексации массива с проверкой границ.

person Community    schedule 03.10.2009

Я считаю, что проще всего сделать цикл.

public static double[,] arraycopy(double[] 
thearray, int n, int nrow, int ncol)
{

double[] sourcearray;
double[,] newarray;
int i = 0;
int j = 0;

sourcearray = new double[n];
sourcearray = thearray;
newarray = new double[nrow, ncol];
for(i=0; i<nrow; i++)
{
    for(j=0; j<ncol; j++)
        newarray[i,j] = sourcearray[nrow*i + j]; 
}

return newarray;

}
person Gerry    schedule 24.03.2021

Итак, что-то вроде:

    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;
    }
person Justin Drury    schedule 08.07.2009
comment
Это наоборот; получение элементов из двухмерного массива в одномерный массив. (Кроме того, массив длиной 10 имеет индекс 0-9, а не 0-10). - person Guffa; 08.07.2009
comment
Ой, моя беда, я на самом деле не запускал код, я просто делал это по памяти. - person Justin Drury; 08.07.2009