none
Rendre une List<> ReadOnly

    Question

  • Bonjour 

    J'ai une liste déclarée dans une classe de la façon suivante.

     public static readonly List<ToponymeGeoDb> ListeToponymesGeoDb = new List<ToponymeGeoDb>();

    Cette liste est chargée à partir d'une base Access.

    Quelque part dans mon programme, sans que j'ai réussi à savoir où, cette liste est modifiée contre mon souhait.

    1) Est-il possible de créer un évenement qui m'indique si l'un des éléments de la liste est modifié?

    2) Sinon, comment faire pour empêcher sa modification.

    Merci

    Bernard


    Bernard Bouree

    jeudi 31 août 2017 08:46

Réponses

  • Oui.

    En fait ce qu'il faut savoir c'est que roDinosaures est une bien une liste en lecture seule.

    C'est un wrapper de la liste dinosaurs grâce à cette ligne de code : 

    IList<string> roDinosaurs = dinosaurs.AsReadOnly();


    Attention, si la liste dinosaurs est modifiée, la modification s'effectuera également sur la liste roDinosaures.

    Du coup, ce que vous devez faire c'est d'utiliser dans votre programme la liste roDinosaures une fois que la liste dinosaurs contient toutes ses valeurs.

    J'espère que j'ai bien répondu à votre question.


    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi



    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    jeudi 31 août 2017 16:09

Toutes les réponses

  • Bonjour Bernard,

    Voici les réponses à vos questions : 

    1) Est-il possible de créer un évenement qui m'indique si l'un des éléments de la liste est modifié?

    ==> Oui, vous trouverez la réponse dans ce lien : https://stackoverflow.com/questions/24925037/how-can-i-detect-if-liststring-was-changed-and-what-is-the-last-item-that-wa/24925133

    2) Sinon, comment faire pour empêcher sa modification.

    ==> En utilisant la méthode AsReadOnly().

                List<string> List2 = new List<string> { "D", "E", "F" }; 
    
                List2.AsReadOnly();

    J'espère que j'ai bien répondu à votre question.


    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;


    jeudi 31 août 2017 09:02
  • Bonjour Nourdine

    Merci pour votre réponse.

    Je suis aller consulter MSDN et je suis perplexe. Dans l'exemple présenté l'élément 2 est modifié alors que je m'attendais à ce que cela ne puisse se faire!

     List<string> dinosaurs = new List<string>(4);
    
            Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
    
            dinosaurs.Add("Tyrannosaurus");
            dinosaurs.Add("Amargasaurus");
            dinosaurs.Add("Mamenchisaurus");
            dinosaurs.Add("Deinonychus");
    
            Console.WriteLine();
            foreach(string s in dinosaurs)
            {
                Console.WriteLine(s);
            }
    
            Console.WriteLine("\nIList<string> roDinosaurs = dinosaurs.AsReadOnly()");
            IList<string> roDinosaurs = dinosaurs.AsReadOnly();
    
            Console.WriteLine("\nElements in the read-only IList:");
            foreach(string dinosaur in roDinosaurs)
            {
                Console.WriteLine(dinosaur);
            }
    
            Console.WriteLine("\ndinosaurs[2] = \"Coelophysis\"");
            dinosaurs[2] = "Coelophysis";
    
            Console.WriteLine("\nElements in the read-only IList:");
            foreach(string dinosaur in roDinosaurs)
            {
                Console.WriteLine(dinosaur);
            }

    Bernard


    Bernard Bouree

    jeudi 31 août 2017 09:16
  • En fait j'avais mal lu l'exemple.

    roDinosaurs[2] = "Coelophysis";

    déclenche bien une exception


    Bernard Bouree

    jeudi 31 août 2017 15:28
  • Oui.

    En fait ce qu'il faut savoir c'est que roDinosaures est une bien une liste en lecture seule.

    C'est un wrapper de la liste dinosaurs grâce à cette ligne de code : 

    IList<string> roDinosaurs = dinosaurs.AsReadOnly();


    Attention, si la liste dinosaurs est modifiée, la modification s'effectuera également sur la liste roDinosaures.

    Du coup, ce que vous devez faire c'est d'utiliser dans votre programme la liste roDinosaures une fois que la liste dinosaurs contient toutes ses valeurs.

    J'espère que j'ai bien répondu à votre question.


    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi



    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    jeudi 31 août 2017 16:09
  • Bonjour Nourdine

    Merci pour cette clarification, j'étais en train de m'arracher les cheveux car je pensais que les deux listes étaient indépendantes.

    J'avais donc fait un Clear() de la première et ne comprenait pas pourquoi la ReadOnly se vidait.

    Merci pour votre aide

    Bernard


    Bernard Bouree

    jeudi 31 août 2017 16:47