初始化锯齿状数组

And*_*hin 18 .net c# 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];
}
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种更美好的方式.可能是这样的:

int[][][] count = new int[10][10][10];
Run Code Online (Sandbox Code Playgroud)

dtb*_*dtb 24

int[][][] my3DArray = CreateJaggedArray<int[][][]>(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

运用

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;
}
Run Code Online (Sandbox Code Playgroud)


Mec*_*eli 12

你可以试试这个:


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

  • 我想知道为什么这没有被投票赞成......对于 `int` 以外的类型: `double[] data = {new double[] {1, 4, 2}, new double[] {7, 4, 2,1 , 0.66, 5.44}, 新双[] {1.2345678521, 874347665423.12347234563233, 5e33, 66e234, 6785e34}};` (3认同)

Guf*_*ffa 7

没有内置的方法来创建一个数组并在其中创建所有元素,因此它甚至不会接近你想要它的简单程度.这将是真正的工作.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用它来创建一个三级锯齿状数组:

int[][][] count = CreateArray<int[][]>(10, () => CreateArray<int[]>(10, () => new int[10]));
Run Code Online (Sandbox Code Playgroud)