tridimensional multidimensional float declarar declaracion array c# .net jagged-arrays

multidimensional - float array c#



Inicializando matrices dentadas (9)

¿Por qué no intentas esto?

int[,,] count = new int[10, 10, 10];

¿Algún problema se ve con este tipo de representación?

Quiero crear la matriz 10 * 10 * 10 en C # como int[][][] (no int[,,] ).

Puedo escribir codigo

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]; }

Pero estoy buscando una forma más bella para ello. Puede ser algo así:

int[][][] count = new int[10][10][10];


Con un poco de ayuda de Linq.

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

Seguro que no es bonito y probablemente no rápido, pero es de una sola línea.


No hay una forma integrada de crear una matriz y crear todos los elementos en ella, por lo que no va a estar ni cerca de lo simple que quieres que sea. Va a ser tanto trabajo como realmente es.

Puedes hacer un método para crear una matriz y todos los objetos en ella:

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

Luego puedes usar eso para crear una matriz dentada de tres niveles:

int[][][] count = CreateArray<int[][]>(10, () => CreateArray<int[]>(10, () => new int[10]));


No hay una manera "más elegante" que escribir los 2 bucles for. Es por eso que se llaman "dentados", los tamaños de cada sub-matriz pueden variar.

Pero eso deja la pregunta: ¿por qué no usar la versión [,,]?


Podría usar un conjunto de datos con datos idénticos. Eso podría comportarse como un objeto 3D (xyz = fila, columna, tabla) ... Pero vas a terminar con algo grande sin importar lo que hagas; Todavía tienes que dar cuenta de 1000 artículos.


Podrías probar esto:

int[][][] data = { new[] { new[] {1,2,3} }, new[] { new[] {1,2,3} } };

O sin valores explícitos:

int[][][] data = { new[] { Enumerable.Range(1, 100).ToArray() }, new[] { Enumerable.Range(2, 100).ToArray() } };


Una matriz tridimensional suena como un buen caso para crear tu propia clase. Ser orientado a objetos puede ser hermoso.


int[][][] count = Array.ConvertAll(new bool[10], x => Array.ConvertAll(new bool[10], y => new int[10]));


int[][][] my3DArray = CreateJaggedArray<int[][][]>(1, 2, 3);

utilizando

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