Initialisation de tableaux déchiquetés

Je veux créer un tableau 10 * 10 * 10 en C # comme int[][][] (pas int[,,] ).

Je peux écrire du code:

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

mais je cherche un moyen plus beau pour cela. Peut-être quelque chose comme ça:

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

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

en utilisant

 static T CreateJaggedArray(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; } 

Vous pouvez essayer ceci:

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

Ou sans valeurs explicites:

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

Il n’y a pas de méthode intégrée pour créer un tableau et y créer tous les éléments. Par conséquent, cela ne sera même pas aussi simple que vous le souhaiteriez. Ça va être autant de travail que ça l’est vraiment.

Vous pouvez créer une méthode pour créer un tableau et tous les objects qu’il contient:

 public static T[] CreateArray(int cnt, Func itemCreator) { T[] result = new T[cnt]; for (int i = 0; i < result.Length; i++) { result[i] = itemCreator(); } return result; } 

Ensuite, vous pouvez l’utiliser pour créer un tableau à trois niveaux:

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

Un tableau en trois dimensions semble être un bon exemple pour créer votre propre classe. Être orienté object peut être beau.

Il n’y a pas de manière “plus élégante” que d’écrire les 2 for-loops. C’est pourquoi ils sont appelés ‘en dents de scie’, la taille de chaque sous-tableau peut varier.

Mais cela laisse la question: pourquoi ne pas utiliser la version [,,]?

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

Vous pouvez utiliser un jeu de données avec des tables de données identiques. Cela pourrait se comporter comme un object 3D (xyz = rangée, colonne, tableau) … Mais vous allez vous retrouver avec quelque chose de gros, peu importe ce que vous faites; il vous rest à comptabiliser 1000 articles.

Avec un peu d’aide de Linq

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

Ce n’est certainement pas joli et probablement pas rapide, mais c’est un one-liner.