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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    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 confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 197
    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.

  4. #4
    Membre éclairé
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    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 éclairé
    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
    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

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, 19h02
  2. Réponses: 1
    Dernier message: 09/03/2006, 18h25
  3. [PHP-JS] Liste dynamique
    Par SuperBn dans le forum Langage
    Réponses: 4
    Dernier message: 09/02/2006, 18h09
  4. Réponses: 1
    Dernier message: 16/01/2006, 18h36
  5. Rafraichissement liste dynamique
    Par Petitjean_85 dans le forum ASP
    Réponses: 5
    Dernier message: 14/06/2004, 11h21

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