C#语言中将一维数组赋值给二维数组的语法

17

我想要做类似这样的事情:

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];
}

如何使用循环填充二维数组的行?

谢谢

5个回答

11
不,如果您使用的是二维数组,则不可能直接复制。您必须复制每个项目。 如果您使用锯齿数组,则可以完全正常运行:
// 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;
如果你已经将所有数据作为行获取,那么你当然不需要循环将数组放入数组中,因为你会替换它们。

谢谢。那么,object[][] tableOfObject = new object[10][10]; 和 object[,] tableOfObjects = new object[10,10]; 之间有什么区别呢?非常感谢。 - m3ntat
3
一个对象是一个二维数组,它总是矩形的(所有行的长度都相同)。一个对象[][]是一个不规则数组;即对象[]数组的数组。由于每一行本身就是一个数组,它们的长度可以不同。 - Guffa
请记住,锯齿数组的性能较差,占用的内存比“二维数组”多(实际上它们在内存中作为一维数组保存)。根据您的程序所做的事情,这可能很重要。 - Blindy
@Blindy:你完全搞错了。锯齿数组比二维数组性能更好。不确定是谁告诉你的,但这并不正确。这里有一篇关于这个话题的好文章 - Ed S.
@Blindy: 更好的是:https://dev59.com/cHRB5IYBdhLWcg3w6bYE - Ed S.
为什么要点踩?如果你不解释哪里有问题,那么回答就无法得到改进。 - Guffa

11

如果您的数组是值类型的数组,那么是可能的。

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 开始,该方法只适用于原始数据类型的数组。


1
如果我有千兆字节大小的数组,我会用C++/CLI玩指针,只做memcpy而不是进行无数慢速边界检查的数组索引操作。

0

我觉得最简单的方法就是使用循环。

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;

}

-1

所以,类似这样的:

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

这是相反的操作;将二维数组中的元素获取到一维数组中。(另外,长度为10的数组索引应该是0-9,而不是0-10)。 - Guffa
糟糕,我的错,我实际上没有运行代码,我只是凭记忆在做。 - Justin Drury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接