Comment implémenter l’indexeur de tableaux en C #

je peux taper

Square[,,,] squares = new Square[3, 2, 5, 5]; squares[0, 0, 0, 1] = new Square(); 

En fait, je pense pouvoir continuer à append des dimensions à Int.MaxValue, bien que je n’aie aucune idée de la quantité de mémoire nécessaire.

Comment pourrais-je implémenter cette fonctionnalité d’indexation de variable dans ma propre classe? Je souhaite encapsuler un tableau multidimensionnel de dimensions inconnues et le rendre disponible en tant que propriété, permettant ainsi l’indexation de cette manière. Dois-je toujours connaître la taille, dans quel cas, comment fonctionne Array?

MODIFIER

Merci pour les commentaires, voici ce qui m’a abouti – j’ai pensé aux parameters mais je ne savais pas où aller après cela, sans connaître GetValue.

 class ArrayExt { public Array Array { get; set; } public T this[params int[] indices] { get { return (T)Array.GetValue(indices); } set { Array.SetValue(value, indices);} } } ArrayExt ext = new ArrayExt(); ext.Array = new Square[4, 5, 5, 5]; ext[3, 3, 3, 3] = new Square(); 

TBH Je n’ai pas vraiment besoin de ça maintenant. Je cherchais simplement un moyen d’étendre Array pour initialiser ses éléments, ayant résolu d’éviter le code d’initialisation de boucle en dehors de la classe chaque fois que j’utilisais un multi-tableau (principalement dans des tests unitaires). Ensuite, j’ai frappé intellisense et vu la méthode Initialize … bien que cela me limite à un constructeur par défaut et à des types de valeur. Pour les types de référence, une méthode d’extension serait requirejse. J’ai quand même appris quelque chose et oui, il y avait une erreur d’exécution lorsque j’ai essayé un tableau avec plus de 32 dimensions.

Vous pouvez utiliser varargs:

 class Squares { public Square this[params int[] indices] { get { // ... } } } 

Vous devez gérer le fait que les indices peuvent avoir une longueur arbitraire vous-même, de la manière qui vous semble appropriée. (Par exemple, vérifiez la taille des indices rapport au rang du tableau, tapez-le sous la forme Array et utilisez GetValue() .)

Les types de tableaux sont magiques – int[] et int[,] sont deux types différents, avec des indexeurs séparés.
Ces types ne sont pas définis dans le code source; leur existence et leur comportement sont plutôt décrits par la spécification.

Vous devez créer un type distinct pour chaque dimensionnalité – une classe Masortingx1 avec this[int] , une classe Masortingx2 avec this[int, int] , etc.

utilisez l’opérateur this[] :

 public int this[int i, int j] { get {return 1;} set { ; } } 

Notez que vous ne pouvez pas avoir un nombre variable de dimensions dans un opérateur – vous devez coder chaque méthode séparément:

 public int this[int i, int j, int k] { get {return 1;} set { ; } } public int this[int i, int j] { get {return 1;} set { ; } } public int this[int i] { get {return 1;} set { ; } } 

Je pense pouvoir continuer à append des dimensions à Int.MaxValue

Vous auriez tort

Un tableau peut avoir un maximum de 32 dimensions.