c# 将一维数组赋值给二维数组语法

问题描述 投票:0回答:6

我想做这样的事情:

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

并使用循环填充二维数组行?

谢谢

c# arrays multidimensional-array
6个回答
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;

如果您将所有数据作为行获取,那么您当然不需要将数组放入数组数组中的循环,因为无论如何您都会替换它们。


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;

}

0
投票

在 .NET Core 2.1 及更高版本中,您可以使用

MemoryMarshal.CreateSpan<T>(T, Int32)
方法从多维数组创建线性 Span,然后使用
Span<T>.CopyTo(Span<T>)
方法将所需数据复制到多维数组中或从多维数组中复制。

object[,] tableOfObjects = new object[3, 3]
{
    { 0, 1, 2 },
    { 3, 4, 5 },
    { 6, 7, 8 }
};

object[] rowOfObjects1 = [9, 10, 11];
object[] rowOfObjects2 = new object[4];

Span<object> tableSpan = MemoryMarshal.CreateSpan(ref tableOfObjects[0, 0], tableOfObjects.Length);
// tableSpan is linear here: [0, 1, 2, 3, 4, 5, 6, 7, 8]

rowOfObjects1.AsSpan().CopyTo(tableSpan.Slice(0, rowOfObjects1.Length));
// tableOfObjects is now:
// {
//     { 9, 10, 11 },
//     { 3, 4, 5 },
//     { 6, 7, 8 }
// }

tableSpan.Slice(1, rowOfObjects2.Length).CopyTo(rowOfObjects2);
// rowOfObjects2 is now: [10, 11, 3, 4]

-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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.