将数组/矩阵初始化代码从C++转换为C#
Converting array/matrix initialization code from C++ to C#
我正在将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#中,数组初始值设定项的大小必须与声明的数组大小匹配。如果希望避免重复,则不需要声明大小。
如果你需要所有的条目都是相同的大小,你可以用一个小的辅助函数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]
};
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++