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 :

List dynamique multi dimensions nominative


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut List dynamique multi dimensions nominative
    Bonsoir,
    Je cherche à créer un tableau de Single[] dynamique .
    Et je voudrais le rendre nominatif en déclarant un tableau de string qui me servirait de pointeur nominatif.
    Je pensais à des List mais je n'ai pas compris comment les mettre en œuvre.
    Mes différents noms de List
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] Name = { "Cannette", "Verre", "Bouteille", "Seau" };
    Je voudrais une List par nom dans mon tableau pour faire un truc dans ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List.Canette.add(0.33f);
    List.Verre.add(0.25f);
    Il s'agit de stocker le niveau de remplissage de différents contenant sur un grand nombre de mesures(nombre indéterminé).

    Merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    dictionary<string, list<single>>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dico.add("machin",new list<single>)
    dico["machin"].add(0.25f)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Tu peux aussi implémenter ton propre indexer à ta classe custo.

    Par exemple :
    Code csharp : 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
     
    using System;
    using System.Collections.Generic;
     
    namespace TestIndexer
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyList<Single> MyTest = new MyList<Single>();
                MyTest["Toto"] = new List<Single> { 0.25f, 0.66f };
                MyTest["Titi"] = new List<Single> { 0.1f, 0.2f, 0.3f };
                MyTest["Tata"] = new List<Single> { 10f };
                MyTest.Add("Tutu", new List<Single> { 1f, 2f, 3f, 4f });
     
                Console.WriteLine(MyTest["Titi"][1]);
                MyTest["Tutu"][2] = 15.8f;
                Console.WriteLine(MyTest["Tutu"][2]);
                try
                {
                    Console.WriteLine(MyTest[1][1]);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                Console.ReadKey(true);
            }
        }
     
        class MyList<T> : List<List<T>>
        {
            private List<List<T>> values = new List<List<T>>();
            private List<string> indexes = new List<string>();
     
            public List<T> this[string KeyName]
            {
                get
                {
                    // On ne contrôle pas l'existance, l'erreur standard nous suffit
                    return values[indexes.IndexOf(KeyName)];
                }
                set
                {
                    // Si l'index n'existe pas, alors on crée une nouvelle ligne
                    int idx = indexes.IndexOf(KeyName);
                    if (idx >= 0)
                    {
                        values[idx] = value;
                    }
                    else
                    {
                        indexes.Add(KeyName);
                        values.Add(value);
                    }
                }
            }
     
            // Interdit l'accès à l'indexeur par défaut
            public new List<T> this[int index]
            {
                get
                {
                    throw new InvalidOperationException();
                }
                set
                {
                    throw new InvalidOperationException();
                }
            }
     
            // Pour bien faire, il faut masquer toutes les autres méthodes qui ne vont pas, ou si possible, les enrichir et proposer des surcharges
            public new void Add(List<T> value)
            {
                throw new InvalidOperationException();
            }
            public void Add(string KeyName, List<T> value)
            {
                if (indexes.Contains(KeyName))
                {
                    throw new UriFormatException("Cet élément existe déjà...");
                }
                else
                {
                    this[KeyName] = value;
                }
            }
        }
    }

    C'est légèrement plus long, mais çà permet de travailler avec une classe qui fait exactement ce qu'on veut (et notamment de l'enrichir facilement).

    Dans mon exemple j'utilise deux List<> (un pour les index et un pour les valeurs) au lieu d'un Dictionnary<List<>>, on peut parfaitement utiliser un mix avec la solution du dictionnaire. A ce moment, l'intérêt semble plus limité au premier abord.
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Bonsoir,
    J'ai essayé ton bout de code StringBuilder (Merci).
    Mon appli lit un gros fichier binaire avec une structure régulière mais une taille variable.
    J'ai crée la classe en me basant sur ton exemple, ensuite j'ai fait une routine avec une boucle qui lit le contenu du fichier en extrayant les données stockées.
    Voici la phase d'init
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    RxData["Canette"] = new List<Single> { 0.0f};
    RxData["Bouteille"] = new List<Single> { 0.0f };
    RxData["Verre"] = new List<Single> { 0.0f };
    Et mon code de lecture

    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
     
     
    try
    	{
            if ((myStream = openFileDialog1.OpenFile()) != null)
            	{
                    using (BinaryReader b = new BinaryReader(myStream))
                            {
                                while (pos < length)
                                {
                                    byte IDChannel = b.ReadByte();
                                    switch (IDChannel)
                                    {
                                        case 1:
     
                                            RxData["Canette"][PtId_1] = b.ReadSingle();
                                            RxData["Bouteille"][PtId_1] = b.ReadSingle();
     
                                            RxData["Verre"][PtId_1] = b.ReadSingle();
                                            PtId_1++;
                                            break;
                                    }
    				pos += (1+ 3*4); // longueur d'une trame de donnée
                                }
                            }
                        }
                    }
    catch (Exception ex)
    	{
            MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            }
    Forcément j'ai un petit problème lors du deuxieme passage dans la boucle j'ai une erreur .
    Original error: L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection. Nom du paramètre : index
    Je pense que cela vient du fait de la taille de l'init , seulement d'une seule valeur.
    Comment je peux faire pour que cette liste soit extensible ?

    Merci

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    une collection (list et autres) ne s'utilise pas comme un tableau
    un tableau a une taille définie au début (tant d'éléments)
    une collection est vide par défaut et on fait des .add pour ajouter des éléments (la collection s'agrandit automatiquement, et sans perte de performance comme un tableau pourrait le faire)

    le fait de pouvoir écrire new List<Single> { 0.0f} veut juste dire qu'au lieu de laisser la liste vide tu la pré remplies avec une valeur, qui vaut 0 ici
    mais dans ton cas tu fais juste new List<Single>
    et après tu fais des .add au lieu d'essayer de définir une valeur pour un rang (car ici le rang n'existe pas et ca plante)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Ok
    quand j’écris le code l'aide contextuelle me propose d'écrire le code ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Add(string KeyName, List<T> value)
    mais si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RxData.Add("Canette", b.ReadSingle());
    ça marche pas.
    Comment je rajoute une nouvelle valeur dans le tableau.
    Merci

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 93
    Points : 127
    Points
    127
    Par défaut
    On te demande une liste et tu donnes un single ^^

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    d'accord mais je ne vais créer un tableau à chaque nouvelle valeur que je décode.
    je pensais juste à avoir une liste par type de variables puis charger mes listes à chaque boucle d'extraction.
    Il faut que je modifie la déclaration de "value" dans ma classe.

  9. #9
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    "Ce que l'on conçoit bien s'énonce clairement,Et les mots pour le dire arrivent aisément."


    Si tu donnais toutes les informations dès le début, tu aurais surement une réponse aussi précise que la question.

    Maintenant, manipuler des listes, c'est la base de l'informatique et du C#... donc, peut-être que la lecture d'un chapitre sur les list, dictionary, etc, ne serait pas du
    superflu dans ton cas !!!
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Tu peux par exemple mettre ce code à la place :
    Code csharp : 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
     
            public void Add(string KeyName, List<T> value)
            {
                if (this[KeyName] == null)
                {
                    this[KeyName] = new List<T>();
                }
                foreach (T val in value)
                {
                    this[KeyName].Add(val);
                }
            }
            public void Add(string KeyName, params T[] value)
            {
                if (this[KeyName] == null)
                {
                    this[KeyName] = new List<T>();
                }
                foreach (T val in value)
                {
                    this[KeyName].Add(val);
                }
            }

    Ainsi, tu peux ajouter des valeurs comme ça :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MyTest.Add("Truc", .1f);
    MyTest.Add("Truc", new List<Single> { .2f, .3f });
    MyTest.Add("Truc", new Single[] { .4f, .5f });
    On ne jouit bien que de ce qu’on partage.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par sdecorme Voir le message
    d'accord mais je ne vais créer un tableau à chaque nouvelle valeur que je décode.
    je pensais juste à avoir une liste par type de variables puis charger mes listes à chaque boucle d'extraction.
    Il faut que je modifie la déclaration de "value" dans ma classe.

    Citation Envoyé par Pol63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dico.add("machin",new list<single>)
    dico["machin"].add(0.25f)


    et ca c'est quoi ??
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 296
    Points : 99
    Points
    99
    Par défaut
    Merci StringBuilder tes réponses sont super constructives , j'arrive à récupérer toutes mes données.
    Maintenant je voudrais récupérer les float avec i comme paramètre pour le nom au lieu de mettre "ToTo" et j comme comme pointeur dans la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Single Val = MyTest[i][j]
    Dans ton code tu mets ça, mais je n'arrive pas à le mettre en œuvre.
    Comment je fais pour récupérer le min et le max de chaque List ?
    Merci

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Normal, dans mon exemple, je montre comment le neutraliser :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public new List<T> this[int index]
            {
                get
                {
                    throw new InvalidOperationException();
                }
                set
                {
                    throw new InvalidOperationException();
                }
            }

    Vire ce bout de code pour pouvoir t'en servir.
    Enfin... Plus exactement, modifie son contenu.
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. afficher les contenu d'une liste dynamiquement
    Par mzt.insat dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/04/2006, 18h02
  2. Réponses: 1
    Dernier message: 09/03/2006, 17h25
  3. [PHP-JS] Liste dynamique
    Par SuperBn dans le forum Langage
    Réponses: 4
    Dernier message: 09/02/2006, 17h09
  4. Réponses: 1
    Dernier message: 16/01/2006, 17h36
  5. Rafraichissement liste dynamique
    Par Petitjean_85 dans le forum ASP
    Réponses: 5
    Dernier message: 14/06/2004, 10h21

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