[英]Initializing jagged arrays
我想在 C# 中创建数组 10 * 10 * 10 像int[][][]
(不是int[,,]
)。
我可以写代码:
int[][][] count = new int[10][][];
for (int i = 0; i < 10; i++)
{
count[i] = new int[10][];
for (int j = 0; j < 10; j++)
count[i][j] = new int[10];
}
但我正在寻找一种更美丽的方式。 可能是这样的:
int[][][] count = new int[10][10][10];
int[][][] my3DArray = CreateJaggedArray<int[][][]>(1, 2, 3);
使用
static T CreateJaggedArray<T>(params int[] lengths)
{
return (T)InitializeJaggedArray(typeof(T).GetElementType(), 0, lengths);
}
static object InitializeJaggedArray(Type type, int index, int[] lengths)
{
Array array = Array.CreateInstance(type, lengths[index]);
Type elementType = type.GetElementType();
if (elementType != null)
{
for (int i = 0; i < lengths[index]; i++)
{
array.SetValue(
InitializeJaggedArray(elementType, index + 1, lengths), i);
}
}
return array;
}
你可以试试这个:
int[][][] data =
{
new[]
{
new[] {1,2,3}
},
new[]
{
new[] {1,2,3}
}
};
或者没有明确的值:
int[][][] data =
{
new[]
{
Enumerable.Range(1, 100).ToArray()
},
new[]
{
Enumerable.Range(2, 100).ToArray()
}
};
没有内置的方法来创建数组并在其中创建所有元素,因此它甚至不会像您希望的那样简单。 这将与实际工作一样多。
您可以创建一个方法来创建数组及其中的所有对象:
public static T[] CreateArray<T>(int cnt, Func<T> itemCreator) {
T[] result = new T[cnt];
for (int i = 0; i < result.Length; i++) {
result[i] = itemCreator();
}
return result;
}
然后你可以使用它来创建一个三级锯齿状数组:
int[][][] count = CreateArray<int[][]>(10, () => CreateArray<int[]>(10, () => new int[10]));
在Linq 的帮助下
int[][][] count = new int[10][][].Select(t => new int[10][].Select(tt => new int[10]).ToArray()).ToArray();
它肯定不漂亮,可能也不快,但它是单线的。
没有比编写 2 个 for 循环更“优雅”的方式了。 这就是为什么它们被称为“锯齿状”,每个子阵列的大小可能会有所不同。
但这留下了一个问题:为什么不使用 [,,] 版本?
int[][][] count = Array.ConvertAll(new bool[10], x =>
Array.ConvertAll(new bool[10], y => new int[10]));
一个 3 维数组听起来像是创建自己的类的好例子。 面向对象可以是美丽的。
您可以使用具有相同数据表的数据集。 这可能表现得像一个 3D 对象(xyz = 行、列、表)……但是无论你做什么,最终都会得到一些大的东西; 你仍然需要考虑 1000 个项目。
你为什么不试试这个?
int[,,] count = new int[10, 10, 10]; // Multi-dimentional array.
你看到这种表示有什么问题吗??
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.