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