将数组/矩阵初始化代码从C++转换为C#

本文关键字:C++ 转换 代码 初始化 数组 | 更新日期: 2023-09-27 18:25:53

我正在将C++代码转换为C#。我遇到了一些C++数组静态初始化问题。考虑以下C++:

int Values[][32] = {
   {}, {}, {1, 2, 3}, {1}
};

它的作用是创建一个4x32整数的矩阵。我需要以尽可能直接的方式在C#中做相同或类似的事情。我想得到任一

static int[][] Values = {...};

static int[,] Values = {...};

问题是C#似乎不允许在子数组大小不均匀的情况下进行数组初始化。除此之外,如果指定new int[4,32] {...},则大括号之间的所有内容都必须恰好为32长度。使用C++,可以指定{1, 2, 3},编译器将用零填充其余缺失的数组成员。

[编辑]我试过使用LINQ,得到了我想要的,但它看起来很麻烦。

将数组/矩阵初始化代码从C++转换为C#

在C#中,数组初始值设定项的大小必须与声明的数组大小匹配。如果希望避免重复,则不需要声明大小。

如果你需要所有的条目都是相同的大小,你可以用一个小的辅助函数Expand来完成,比如:

static int[] Expand(int[] src, int size) {
    var res = new int[size];
    Array.Copy(src, res, src.Length);
    return res;
}
static int[][] Values = new int[4][] {
    Expand(new[] {1}, 32) 
,   Expand(new[] {1,2,3}, 32) 
,   Expand(new[] {1,2,3}, 32) 
,   Expand(new[] {1,2,3, 4, 5}, 32) 
};

我删除了以前的答案,并添加了另一个(不那么雄辩)应该有效的答案。

// utility function you can put in a class
static int[] BuildArray32(params int[] values)
{
    int[] retVal = new int[32];
    Array.Copy(values, retVal, values.Length);
    return retVal;
}
// array initializer code
int[][] Values = {
    BuildArray32(),
    BuildArray32(),
    BuildArray32(1, 2, 3),
    BuildArray32(1),
};

EDIT或者您可以创建一个生成器类:)

class MatrixBuilder
{
    int width;
    List<int[]> rows;
    public MatrixBuilder(int width)
    {
        this.width = width;
        this.rows = new List<int[]>();
    }
    public MatrixBuilder Add(params int[] row)
    {
        int[] wideRow = new int[width];
        Array.Copy(row, wideRow, row.Length);
        rows.Add(wideRow);
        return this;
    }
    public int[][] ToMatrix()
    {
        return rows.ToArray();
    }
}
int[][] Values2 = new MatrixBuilder(32)
    .Add()
    .Add()
    .Add(1, 2, 3)
    .Add(1)
    .ToMatrix();

在c#中无法做到这一点。您可以将数组初始化为零,然后应用已知的初始值:

        int[][] initAll = new []
                               {
                                   new int[32] ,
                                   new int[32] ,
                                   new int[32] ,
                                   new int[32] 
                               };

或者初始化锯齿状阵列:

int[][] initJagged = new[]
                               {
                                   new[] {1, 3, 5, 7, 9},
                                   new[] {1, 3, }, 
                                   new[] {1, 3,0,0,0,0,},
                                   new int[32] 
                               };