[C#] Définition d'un indexeur sur un tableau ?

Mod Message lu Posté le 26 Déc 2008 à 16:48 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Avec un petit peu d'explication pour la forme :p.

J'ai ceci :

Code : C#
class MyClass
{
    private int[][] data;
 
    public int this[int x, int y]
    {
        get
        {
            return data[x][y];
        }
    }
}


Une propriété data, qui est donc accédée à l'aide d'un indexeur à deux paramètres. Le détail qui me chagrine, là-dedans, c'est que l'accès se fera par exemple de cette manière, avec les deux paramètres collés :

Code : C#
MyClass myObj;
int value = myObj[0,0]


Ce que je souhaiterais faire, à la place, ce serait d'avoir cette syntaxe :

Code : C#
MyClass myObj;
int value = myObj[0][0]


Le détail est minime, mais c'est plus clair, car plus proche de l'accès habituel d'un tableau à deux dimensions en C#. Et il se trouve que si je sais comment définir un indexeur sur la classe pour accéder à la première dimension (en retournant alors un int[]), j'ignore comment en définir un second sur ce int[], qui me permettrait donc d'avoir la syntaxe à double paire de crochets. A vrai dire, j'ignore même si c'est possible...

Quelqu'un saurait-il donc me répondre à ce propos ?
Gulix Message lu Posté le 26 Déc 2008 à 17:10 Bulle
Avatar de Gulix
Membre Confirmé

Messages : 184
GCPoints : 8860
Code : C#
 
  public int[] this[int x]
        {
            get
            {
                return data[x];
            }
        }
 


tout simplement. Ainsi, tu retournes un tableau de int[] que tu accèdes directement :

Code : C#
 
MyClass obj = new MyClass();
int myValue = obj[x][y];
 


Puisque c'est du côté de la syntaxe que tu cherches à améliorer ça, ça devrait être bon, non ? Ca ne retourne pas exactement un entier, mais ça fait ce que tu lui demandes.

PS : comment on indique, dans la balise code, le langage cible ?
Dernière édition le 26 Déc 2008 à 21:22
"Bien souvent, l'école représente votre meilleure chance. Non pas d'apprendre quoi que ce soit, bien sûr, mais de survivre à une attaque de morts-vivants".
Max Brooks - Guide de survie en territoire zombie

Mon Blog, mélange de prog' et de culture
Blind Shark - Pull N' Bounce
Mod Message lu Posté le 26 Déc 2008 à 20:23 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Apparemment, je me suis mal exprimé. Ce que je cherche à faire, c'est quelque chose qui j'imaginerais de ce genre là :

Code : C#
public int this[int x][int y]
{
    get
    {
         return data[x][y];
    }
}


Tout simplement pour pouvoir récupérer les int à l'aide de myObj[0][0] au lieu de myObj[0,0]...

Merci de la réponse en tout cas :).


Pour la balise, il suffit de préciser un = suivi du nom du langage, par exemple, code=C#.
Dernière édition le 26 Déc 2008 à 20:23
Gulix Message lu Posté le 26 Déc 2008 à 21:39 Bulle
Avatar de Gulix
Membre Confirmé

Messages : 184
GCPoints : 8860
C'est ce que je t'ai proposé non ? :strange: On ne peut obtenir ce résultat qu'en renvoyant un tableau de int, que tu peux directement consulter. La syntaxe est celle que tu recherches, mais passe par un chemin détourné.

Ce que tu as là n'est pas qu'un problème de syntaxe. int[][] est un jagged array, alors que int[,] est un tableau à 2 dimensions, ce qui se manipule différemment.

Pour les indexers, il ne s'agit pas de tableau, mais de clé. Comme pour un dictionnaire en gros (tu peux faire un indexer sur une clé, par exemple). Le traitement derrière l'indexer peut être n'importe quoi, comme un calcul :

Code : C#
 
class CalculExposant
{
int myValue;
 
public int this[int exposant]
{
   return Math.Pow(myValue, exposant);
}
 


C'est cool de voir d'autres programmeurs C# dans le coin :cool:
Dernière édition le 26 Déc 2008 à 21:40
"Bien souvent, l'école représente votre meilleure chance. Non pas d'apprendre quoi que ce soit, bien sûr, mais de survivre à une attaque de morts-vivants".
Max Brooks - Guide de survie en territoire zombie

Mon Blog, mélange de prog' et de culture
Blind Shark - Pull N' Bounce
Mod Message lu Posté le 27 Déc 2008 à 09:25 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Aaaah, oui, au temps pour moi, je n'avais pas compris que l'accès à la deuxième dimension s'effectuait sans indexeur, je n'avais du coup pas bien compris non plus comment le mettre en oeuvre. En effet, comme cela le comportement est celui que j'attendais. Merci :happy: .

Après une journée passée à coder, on a vraiment le cerveau qui tourne au ralenti ^^'.
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.1125 secondes