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 :

Méthode "propre" pour qu'un élément d'une liste puisse propager des choses à la liste ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Méthode "propre" pour qu'un élément d'une liste puisse propager des choses à la liste ?
    Bonjour,

    J'ai une liste (classe munie d'un indexeur), dans laquelle je ne veux pas de doublons.

    Donc lorsque je fais un :
    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maliste[i].ChangeLaValeur();

    Je voudrais que mon élément dire "ok, maintenant, lance la méthode check()" de la liste.

    Comment faire ?

    Je passerais bien une référence à la liste sur chacun des éléments, mais c'est pas terrible, si ?

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Salut, bof bof la ref à tous les items... moi je te propose de passer par un événement tout simplement.
    Ci-dessous un exemple basique à adapter à ta solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //un petit main qui ressemble à ce que tu as demandé dans ton post
    static void Main()
            {
     
                Liste liste = new Liste();
                liste.Add(new Item() { id = 1 });
                liste.Add(new Item() { id = 2 });
                liste.Add(new Item() { id = 3 });
     
                liste[0].id = 5; //console --> Item changed running check
     
                Console.ReadLine();
            }
    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
     
    //la classe de données qui contient l'événement lancé à chaque fois qu'une propriété est modifiée.
    //Ici seule la prop id est contrôlée
    class Item
        {
            public delegate void ChangedEvent(Item pItem);
            public event ChangedEvent changed;
     
            protected virtual void OnChanged()
            {
                if (changed != null)
                {
                    changed(this);
                }
            }
     
            private int _id;
            public int id
            {
                get { return _id; }
                set { _id = value; OnChanged(); }
            }
        }
    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
     
    //la classe liste qui stocke les données et qui et qui s'abonne à l'événement "Changed" des items qu'elle stocke à chaque fois qu'on lui en rajoute un.
    //désabonnement quand l'item est supprimé de la liste.
    //enfin à toi de voir le comportement que tu souhaites adopter et surtout le contrôle que tu souhaites effectuer dans la méthode "Check"
    class Liste : List<Item>
        {
            public new void Add(Item pItem)
            {
                pItem.changed += new Item.ChangedEvent(Check);
                base.Add(pItem);
            }
     
            public new void Remove(Item pItem)
            {
                pItem.changed -= Check;
                base.Remove(pItem);
            }
     
            private void Check(Item pItem)
            {
                Console.WriteLine("Item changed running check");
                for (int i = 0; i < this.Count; i++)
                {
                    //check other ids
                }
            }
        }

    Voila une solution. Tu me dis si ça te convient.

  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
    La méthode me va, et c'est effectivement ce que j'ai commencé à implémenter.

    En revanche, j'ai un léger souci.

    Pour faire simple, mon objet est une sorte de Datatable.

    J'ai donc :
    - Une liste qui contient la définition des colonnes
    - Une liste de liste qui contient pour chaque ligne, les valeurs de chaque colonne.

    Et mon indexeur porte sur la ligne.

    Sauf que lorsque j'accède à une ligne, au lieu de retourner le List<UnType> qui correspond à la ligne demandée, je renvoie une instance vers un nouvel objet qui contient :
    - Une référence vers la liste des colonnes
    - Une référence vers le List<UnType>

    Et cet objet dispose lui-même d'un indexeur, permettant, à partir d'un nom de colonne, de retrouver l'élément de la liste qui contient la valeur.

    Maintenant mon objet principal dispose d'un méchanisme de contrôle de la cohérence de son contenu : interdit d'avoir deux lignes identiques.

    Et donc, quand je fais :

    Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObject[12]["MaColonne"] = new UnType("nouvelle valeur");

    Je n'arrive pas à trouver à quoi doit s'abonner "MonObjet" pour détecter le remplacement de ma valeur... étant donné que :
    - Elle est écrasée (donc pas de méthode appelable du genre "UpdateValeur(nouvellevaleur)"
    - Que "MonObjet[12]" n'est créé que le temps de l'affectation de la valeur
    - Et du coup que j'ai très mal à a tête depuis deux jours

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Ton code est confidentiel ?
    Enfin le bout que tu cherches à développer. Si possible en standalone bien séparé du reste du projet quoi.
    Car je comprends bien tous les mots que tu utilises sauf qu'à représenter mentalement quand on connait pas le type de données utilisé et à quoi cela correspond dans la réalité c'est trop dur
    Si tu postes je vais voir si je peux te trouver une petite solution. Sinon impossible comme ça.

  5. #5
    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
    Citation Envoyé par lead8209 Voir le message
    Ton code est confidentiel ?
    Non pas du tout, c'est de la veille techno

    Seulement, j'ai pas le code sous la main, donc j'ai du tout retaper en vitesse de tête

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Je regarde. Je te tiens au jus demain matin.

  7. #7
    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
    J'ai réécrit en vitesse un prototype de ce que je veux faire :
    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
    91
    92
    93
    94
    95
     
    using System;
    using System.Collections.Generic;
     
    namespace AccessorTest
    {
        public class Value
        {
            public string value = string.Empty;
     
            public Value(string value)
            {
                this.value = value;
            }
        }
     
        public class Record
        {
            private List<string> Columns;
            private List<Value> Values;
     
            public Record(List<string> columns, List<Value> values)
            {
                this.Columns = columns;
                this.Values = values;
            }
     
            public Value this[int Index]
            {
                get
                {
                    return Values[Index];
                }
                set
                {
                    Values[Index] = value;
                }
            }
     
            public Value this[string Column]
            {
                get
                {
                    for (int i = 0, cpt = Columns.Count; i < cpt; i++)
                    {
                        if (Columns[i] ==  Column)
                        {
                            return Values[i];
                        }
                    }
                    throw new KeyNotFoundException();
                }
                set
                {
                    for (int i = 0, cpt = Columns.Count; i < cpt; i++)
                    {
                        if (Columns[i] ==  Column)
                        {
                            Values[i] = value;
                            break;
                        }
                    }
                }
            }
     
            public List<Value> GetValues()
            {
                return Values;
            }
        }
     
        public class MonDT
        {
            private List<List<Value>> Values;
            private List<string> Columns;
     
            public MonDT(List<string> columns, List<List<Value>> values)
            {
                this.Values = values;
                this.Columns = columns;
            }
     
            public Record this[int Index]
            {
                get
                {
                    return new Record(Columns, Values[Index]);
                }
                set
                {
                    Values[Index] = value.GetValues();
                }
            }
        }
    }

    Qu'on utilise de la sorte :
    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
     
    using System;
    using System.Collections.Generic;
     
    namespace AccessorTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                MonDT dt = new MonDT(new List<string>(new string[] { "cle", "valeur" }), new List<List<Value>>(new List<Value>[] {
                    new List<Value>(new Value[] { new Value("1"), new Value("toto") }),
                    new List<Value>(new Value[] { new Value("2"), new Value("titi") }),
                    new List<Value>(new Value[] { new Value("3"), new Value("tata") })
                }));
     
                Console.WriteLine(dt[1]["valeur"].value);
                dt[1]["valeur"] = new Value("plop");
                Console.WriteLine(dt[1]["valeur"].value);
                Console.ReadKey();
            }
        }
    }

    Je veux que lorsque je fais "dt[1]["valeur"] = new Value("plop");" je puisse déclencher une méthode "Check()" de mon instance "dt".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Correction pour ajouté un élément dans une liste
    Par Rifton007 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/01/2007, 11h09

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