24

我想在 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];
4

9 回答 9

25
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;
}
于 2009-11-15T22:17:01.997 回答
18

你可以试试这个:


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

于 2015-03-23T15:59:26.560 回答
8

没有内置的方法来创建一个数组并在其中创建所有元素,所以它甚至不会接近你想要的简单程度。这将是尽可能多的工作。

您可以创建一个方法来创建数组及其中的所有对象:

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]));
于 2009-11-15T22:13:40.163 回答
2

Linq的帮助下

int[][][] count = new int[10][][].Select(t => new int[10][].Select(tt => new int[10]).ToArray()).ToArray();

它肯定不漂亮,可能也不快,但它是单线的。

于 2018-07-19T11:38:04.817 回答
1

没有比编写 2 个 for 循环更“优雅”的方法了。这就是为什么它们被称为“锯齿状”,每个子阵列的大小可以变化。

但这留下了一个问题:为什么不使用 [,,] 版本?

于 2009-11-15T22:14:15.980 回答
1
int[][][] count = Array.ConvertAll(new bool[10], x =>
                  Array.ConvertAll(new bool[10], y => new int[10]));
于 2016-02-24T23:46:41.497 回答
0

3 维数组听起来像是创建自己的类的好例子。面向对象可以很漂亮。

于 2009-11-15T22:00:34.733 回答
0

您可以使用具有相同数据表的数据集。这可能表现得像一个 3D 对象(xyz = 行、列、表)......但无论你做什么,你最终都会得到一些大的东西;您仍然需要考虑 1000 个项目。

于 2009-11-15T22:04:42.110 回答
-1

你为什么不试试这个?

int[,,] count = new int[10, 10, 10]; // Multi-dimentional array.

你看到这种表示有什么问题吗?

于 2019-01-23T14:56:11.887 回答