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 :

Problème de collection


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut Problème de collection
    Bonjour,

    Je cherche un moyen de retourner à l'utilisateur d'une bibliothèque une collection qui ne puisse pas être modifiée en taille (pas de Add() ni Remove() par exemple) mais dont les données puissent être modifiée.

    Problème en profondeur :

    J'écris en ce moment une bibliothèque pour lire/écrire des fichiers binaires normés (chaque champs a sa place propre et est documenté).

    Imaginons que le fichier binaire commence (en-tête du fichier) par 5 shorts (System.Int16), je crée un BinaryReader et je met mes 5 shorts dans un conteneur de type List<short>.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class EnTete
    {
         // membre privé
         private List<short> m_list;
     
         // propriété
         public ??? Header { get { return m_list.??? ; } }
     
         //ctor
         // [...] initialisation de m_list et lecture de 5 shorts [ m_list.Add() ]
    }

    Ce que j'aimerais c'est trouver un conteneur (ou autre chose) que je puisse retourner à l'utilisateur et qui lui permette de modifier les shorts compris dans le membre m_list, mais qu'il ne soit pas possible de modifier la taille de m_list.

    Quel serait le meilleur moyen de parvenir à ce résultat selon vous ? (quitte à utiliser autre chose qu'un conteneur de type List<T>)

    Je vous remercie !

    P.S : je travaille en C# avec le framework 3.0

  2. #2
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Ca va te paraitre con mais il suffirait de retourner un simple tableau [].

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Citation Envoyé par _skip Voir le message
    Ca va te paraitre con mais il suffirait de retourner un simple tableau [].
    Ca serait effectivement une solution. J'y ai bien pensé mais j'aurais du préciser que le mieux serait une propriété indexable, plus facile d'utilisation. Hors, en retour de propriété ça n'est pas indexable [ return m_list.AsArray() ].

    Tiré de "Properties should not return arrays" :

    http://msdn2.microsoft.com/en-us/lib...kc(VS.80).aspx

    Typically, users will not understand the negative performance implications of calling such a property. Specifically, they might use the property as an indexed property.

  4. #4
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Sinon, tu peux toujours te faire une classe wraper du genre :

    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
     
        public class ListWraper<T>
        {
            private List<T> InternalList;
     
            public ListWraper(IEnumerable<T> en)
            {
                InternalList = new List<T>(en);
            }
     
            public T this[int index]
            {
                get { return InternalList[index]; }
                set { InternalList[index] = value; }
            }
        }

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    ReadOnlyCollection<> est ton amie. =)

    Tu peux l'instancier depuis une List<> existante (.AsReadOnly()) ou sur un new (IList<>). Ca fournit exactement ce que Maa disait au dessus, un wrapper bati sur IList en lecture seule.

  6. #6
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    J'y ai bien pensé mais j'aurais du préciser que le mieux serait une propriété indexable, plus facile d'utilisation. Hors, en retour de propriété ça n'est pas indexable [ return m_list.AsArray() ].
    Je ne comprends pas trop ce que cela veux dire. Quelqu'un pourrait me l'expliquer ?

  7. #7
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Hmm oui désolé, c'est confus. En fait ce que je voulais dire c'est que le fait de retourner un tableau à l'utilisateur (et que celui-ci met à jour le tableau) ne met pas à jour la list interne à la classe...

  8. #8
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Dans le cas de type de donnée valeur, en effet non.

  9. #9
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Oui effectivement le wrapper me semble une bonne option ! (je me sent bête de ne pas y avoir pensé... ).

    Citation Envoyé par DonkeyMaster Voir le message
    La première solution qui me vient à l'esprit, c'est de créer ta propre implémentation de l'interface que tu veux.
    J'avais tenté d'implémenter des interface de collection (IList<T> et ICollection<T> notamment), mais ce qui me gênais c'est le fait de lancer une exception (NotImplementedException) sur certaines méthodes. Même si on les documentent, elles reste (les méthodes/propriétés "prohibées") disponibles.

    Citation Envoyé par SirJulio Voir le message
    ReadOnlyCollection<> est ton amie. =)
    J'ai essayé, mais c'est ReadOnly dans tout les sens du terme... (pas moyen de modifier le contenu même de la collection).

    Je vais faire des tests mais l'option "wrapping" me semble très bien.

    Merci pour vos réponses. Si je bloque je reviendrais à la charge

  10. #10
    Membre éclairé Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Par défaut
    La première solution qui me vient à l'esprit, c'est de créer ta propre implémentation de l'interface que tu veux (on va dire que c'est une IList).

    Tiens, je te donne le début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MaListe<T> : IList<T>
    {
        private List<T> _liste_interne;
     
        public MaListe () {
            _liste_interne = new List<T>();
        }
     
     
        public int IndexOf (T item) {
            return _liste_interne.IndexOf(item);
        }
    }
    et puis, quand on arrive à Add et Remove
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void Add (T item) {
        throw new Exception( "Opération illégale" );
    }
     
    public void Clear () {
        throw new Exception( "Opération illégale" );
    }
    et ainsi de suite... (Insert, RemoveAt, mais tu tomberas bien dessus au fur et à mesure).

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

Discussions similaires

  1. Problème de collection SOS
    Par MAXIPAT dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/02/2007, 14h04
  2. problème utilisation Collection et List
    Par nawal_ensias dans le forum Services Web
    Réponses: 1
    Dernier message: 03/01/2007, 15h51
  3. Problème de collections [débutant]
    Par jackin dans le forum Langage
    Réponses: 5
    Dernier message: 10/07/2006, 14h04
  4. [EJB2.1 Entity] Problème de collection
    Par tofke dans le forum Java EE
    Réponses: 11
    Dernier message: 23/12/2005, 16h37
  5. [C#] Problème de Collection de controles...
    Par kunfuka dans le forum ASP.NET
    Réponses: 10
    Dernier message: 08/12/2005, 16h52

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