IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Matrice (tableau d'objets) et listes


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 2
    Points
    2
    Par défaut Matrice (tableau d'objets) et listes
    Bonjour,

    je n'ai pas trouvé ce que je cherchais en effectuant une recherche sur ce forum.
    Par avance, merci pour vos conseils.

    J'aimerais créer un tableau à 2 dimensions (matrice),
    y placer des nombres "objets" (au sens de la POO) plutôt que des "int".
    Créer différentes listes (méthodes ?) dont chacune contient différents objets tirés de la matrice.
    Les objets placés dans les listes serviraient (j'en suis pas encore là) à animer des "objets géométriques" comme des rectangles par exemple.

    j'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    {
    // matrice : j'ai des valeurs int. Dans c# est-ce des objets ?
     
                    int[][] entites = new int[10][];
                    entites [0] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                    entite [1] = new int[] { 11,12,13,14,15,16,17,18,19,20};
                    entites [2] = new int[] { 21,22,23,24,25,26,27,28,29,30};
                    entites [3] = new int[] { etc...};
                    entites [4] = new int[] { etc..};
                    entites [5] = new int[] { etc...};
                    entites [6] = new int[] { etc...};
                    entites [7] = new int[] { etc...}; 
                    entites [8] = new int[] { etc...};
                    entites [9] = new int[] { etc...};
     
     
                   // essai avec une liste pour faire ressortir la liste des 10 premiers nombres : résultat donné par la Console "System.Collections.Generic.List1'[System.int32]              
     
                    List<int> serie1 = new List<int>(entites[0]);
                    Console.WriteLine("Liste en sortie:"+serie1);
     
     
                    Console.ReadKey();
                }
    Merci pour vos éléments de compréhension.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Pour un tableau à deux dimensions tu as un exemple ici

    L'exemple du tutoriel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double[,] réels=new double[,] { {0.5, 1.7}, {8.4, -6}};
    //ou
    double[,] réels={ {0.5, 1.7}, {8.4, -6}};

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Katkiller bonsoir,

    merci pour ta réponse,

    mais je vouloir savoir comme à partir d'une matrice d'objets (ex: des nombres objets) créer par exemple une liste d'objets tirés du tableau à 2 dimensions. Comment on sélectionne dans uns liste des objets de ce tableau ?

  4. #4
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    Bonjour ,

    Pour manipuler les collections en .NET tu as un formidable outil qui s'appel Linq, qui regroupe un tas de méthode ( tri , regroupement,fusion,ajout etc .. ) .

    Dans ton cas j'image que les valeurs correspondent aux abscisses et aux ordonnées . Dans ce cas en parlant POO tu peux créer un objet qui possèdent les propriétés X et Y par exemple.

    Tu auras alors besoin de faire une liste d'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Coordonnees> coordonnees = List<Coordonnees>() { Tes objets ...  }
    Ensuite avec Linq tu fais ce que tu veux ... exemple prendre les 10 premières valeurs de la liste :

    N'hésite pas expliquer ce que tu souhaites faire exactement
    throw new NoSignatureException();

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par WaterTwelve21 Voir le message
    ,


    N'hésite pas expliquer ce que tu souhaites faire exactement
    Merci WaterTwelve21, je n'ai pas encore regardé du côté de cette librairie, Linq. Etant débutant, j'ai plutôt regardé du côté des : table, liste, interface et énumération...

    Ce que je souhaite faire exactement : globalement, c'est [un outil 3D immersif qui affiche dans une salle comme dans un jeu, mais s'est une autre histoire pour l'instant ]; c'est donc un tableau à 2 dimensions dont les cellules sont les coordonnées d'objets (des "carrés qui s'allument" lorsqu'une cellule du tableau est activé).
    Côté programmation, les listes serviraient à déterminer quelles cellules activités et dans quel ordre. C'est pourquoi j'ai pensé à une matrice en mémoire avec des indexes et des listes pour exploiter les objets. A chaque objet correspond un événement (petit carré lumineux)..
    C'est très certainement pas très clair ce que j'écris. Parce que je centre mon explication plutôt sur la programmation.

    Je vais regardé du côté de Linq pour comprendre ce que je peux faire avec.

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // essai avec une liste pour faire ressortir la liste des 10 premiers nombres : résultat donné par la Console "System.Collections.Generic.List1'[System.int32]              
     
                    List<int> serie1 = new List<int>(entites[0]);
                    Console.WriteLine("Liste en sortie:"+serie1);
    Pour le coup, c'est normal que la console t'affiche ça.
    serie1 étant une liste, si tu lui demande d'afficher dans la console "serie1", ça t'affiche son type et non ces valeurs.

    Pour afficher les valeurs de la liste tu dois parcourir la liste et les afficher un par un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                List<int> serie1 = new List<int>(entites[0]);
                foreach (int item in serie1)
                {
                    Console.WriteLine(item);
                }
    Par contre, partir d'un tableau pour ensuite le transformer en liste pour pouvoir requêter dessus est pas pratique, pourquoi ne par faire directement une liste?

    Je n'ai pas très bien compris ton but, mais à ta place je ferais une classe "Carre", qui sera ton objet contenant les coordonnée d'un carré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        class Carre
        {
            // Constructeur de la classe permattant d'attribuer des valeurs aux champs la composant
            public Carre(int cordX, int cordY)
            {
                x = cordX;
                y = cordY;
            }
     
            // La coordonnée x du carré
            public int x { get; set; }
            // La coordonnée y du carré
            public int y { get; set; }
        }
    Puis je ferai un liste de "Carre" contenant les valeurs souhaitées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
            static void Main(string[] args)
            {
                // Liste contenant des objets "Carre", chaque Carre contenant des coordonnées
                List<Carre> listCarre = new List<Carre>();
     
                // Ajout des valeurs, 2 possibilités :
                // Déclarer un nouveau Carre et l'ajouter à la liste
                Carre carre = new Carre(1, 2);
                listCarre.Add(carre);
                // Ou ajouter directement un nouveau carré dans la liste
                listCarre.Add(new Carre(3, 4));
                listCarre.Add(new Carre(5, 6));
                listCarre.Add(new Carre(7, 8));
                listCarre.Add(new Carre(9, 10));
                listCarre.Add(new Carre(11, 12));
                // etc...
     
                // Pour les afficher, il suffit de parcourir la liste
                foreach (Carre item in listCarre)
                {
                    Console.WriteLine("Coordonnée X :" + item.x + " | " + "Coordonnée Y :" + item.y);
                }
     
                Console.ReadKey();
            }
    De cette manière tu gèrera beaucoup plus facilement tes coordonnées.

    Tu peux également ajouter des champs à ta classe "Carre", par exemple un champ boolean "Active" qui passerai à true si la cellule est active.
    Ensuite en faisant un foreach sur la liste tu saurais directement quels cellules sont active et réagir en conséquence.
    Et l'avance de ce genre de liste, c'est que tu as accès à toute une panoplie de méthode pour interagir avec. (ajout, suppression, tri, etc...)

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Là tu veux faire une mixture.
    Remarque :le tableau à 2 dimensions que tu as fourni (1er post) n'est pas un tableau à 2 dimensions mais un "tableau en escalier"("JaggedArray") encore appelé tableau de tableaux!!!)....

    Il est possible de "vidanger" ou recopier le contenu d'un tableau en escalier Tableau[][] de type T (T peut etre un type Valeur : int,double,bool etc ou un type reference : class String,Object ou un Class custom) dans un List<t> de meme type T...

    Cela permet :
    - d'accéder à un élément par son index
    - itérer (For Each in List<T>)
    - recherchez un élément donné: List<T>.Find
    - trouver un élément par son index List<t>.IndexOf
    - rechercher un groupe d'éléments répondant à un prédicat ou condition: List<T>FindAll...

    Si tu veux obtenir un tel résultat il faut procéder comme suit(exemple code ci-après):
    - initialiser et remplir ton Tableau Escalier normalement(tableauEntites)
    - dans la boucle d'initialisation ajouter simultanément l'élément créé dans la liste de travail ( entites)
    L'exemple utilise un class Custom - EntiteGeometrique - et affiche dans :
    -listBox1 le tableau =>tableauEntites
    -listBox2 la liste =>tableauEntites
    Le TextBox permet de rechercher la valeur d'un objet ou instance d'un EntiteGeometrique dont la propriété Nom est égale à la chaine entrée....


    code behind .cs du Form et du class EntiteGeometrique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
     public partial class FormTableaux : Form
        {
     
            private EntiteGeometrique[][] tableauEntites;
            private List<EntiteGeometrique> entites = new List<EntiteGeometrique>();
            public FormTableaux()
            {
                InitializeComponent();
            }
            //initilisation 
            private void btnFillTableau_Click(object sender, EventArgs e)
            {
     
                tableauEntites = new EntiteGeometrique[5][];
                entites = new List<EntiteGeometrique>();
     
                for (int i = 0; i < tableauEntites.GetUpperBound(0)+1; i++)
                {
     
                    tableauEntites[i] = new EntiteGeometrique[3];
                    for (int j = 0; j < tableauEntites[i].GetUpperBound(0) + 1; j++)
    			    {
                        tableauEntites[i][j] = new EntiteGeometrique()
                        {
                            Nom = "Geom" + (i + 1).ToString() + (j + 1).ToString(),
                            Couleur = GetColor(),
                            Position = Getposition(),
                            Taille = new Size(25, 25),
                            IndexLig=i,
                            IndexCol=j
                        };
                        listBox1.Items.Add(tableauEntites[i][j].Infos);
     
                        entites.Add(tableauEntites[i][j]);
    			    }
                }
                listBox2.DataSource = entites;
                listBox2.DisplayMember ="Infos";
     
            }
     
            private void textBoxSearch_TextChanged(object sender, EventArgs e)
            {
                this.labelInfos.Text = textBoxSearch.Text;
            }
            private void textBoxSearch_KeyDown(object sender, KeyEventArgs e)
            {
                this.labelInfos.Text="";
                EntiteGeometrique item = entites.Find(x => x.Nom.ToLower() == textBoxSearch.Text.ToLower());
                if (item != null)
                {
                    this.labelInfos.Focus();
                    this.labelInfos.Text = item.Infos;
                    this.listBox2.SelectedItem = item;
                }
     
            }
     
     
     
            //randomize la couleur de EntiteGeometrique
            private Random rndColor = new Random();
            private Color GetColor()
            {
                return Color.FromArgb(255,
                    rndposition.Next(0, 256),
                    rndposition.Next(0, 256),
                    rndposition.Next(0, 256)
                    );
            }
            //randomize la position de EntiteGeometrique
            private Random rndposition = new Random();
            private Point Getposition()
            {
                int x = rndposition.Next(25, 600);
                int y = rndposition.Next(25, 600);
                return new Point(x, y);           
            }
     
     
     
     
     
        }
        //class hypothetique EntiteGeometrique
        public  class EntiteGeometrique
        {
            public string Nom { get; set; }
    		public Point Position { get; set; }
            public Size Taille { get; set; }
            public Color Couleur { get; set; }
            public int IndexLig { get; set; }
            public int IndexCol { get; set; }
            public string Infos 
            { 
             get {
                 return Nom + " : "+ Position.ToString() + " : " + 
                 Couleur.ToString() + Taille.ToString()+ " : "
                 + IndexLig.ToString() + " , "+ IndexCol.ToString() ;
             } 
            }
    	}
    Nota Bene:
    les index IndexLig (ligne) et IndexCol (colonne) mémorisent pour chaque instance l'index i et j dans le Tableau Escalier d'origine....
    Cela permet pour un élément donné List<t>[i] de se référer au même élément dans le Tableau Escalier, si on utilise le Tableau et le List<T> en concurrence ...
    Bon code...........

Discussions similaires

  1. WebMethod retourne tableau au lieu de list d'objet
    Par Jean_guy dans le forum Services Web
    Réponses: 5
    Dernier message: 13/07/2010, 12h58
  2. Tableau/Matrice à l'intérieure d'une liste.
    Par haigwepa dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 14/01/2009, 16h03
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo