Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Un exemplu de folosire a unui dictionar

   In acest articol, vom lucra un exemplu in care vom folosi o colectie, un dictionar cu perechi de chei de tip int si valori de tip string, dictionar care va fi construit pe baza a ceea ce introduce utilizatorul de la tastatura. Dupa crearea lui, il vom salva intr-un fisier text pe hard. Apoi vom citi colectia din fisierul text.

   Vom alege un proiect de tip Console Application si vom explica notiuni care nu au fost introduse pana acum.

   Construim clasa DictionarExemplu, care va avea ca metode NumarElemente, CreeazaDictionar, SalveazaDictionar, CitesteDictionar.

   Mai intai, in interiorul clasei, declaram un obiect de tip Dictionary<int,string>:

    //declarare obiect de tip Dictionary
    Dictionary<int, string> catalog = null;

   Acest obiect catalog va fi folosit in metodele CreeazaDictionar si SalveazaDictionar.

    //functia de preluare a caracterelor de la tastatura
    public int NumarElemente()
    {
        //cat timp vor fi introduse caractere de la tastatura
        while (true)
        {
            //retinem caracterul
            char ch = Console.ReadKey().KeyChar;

            //vom retine numarul in aceasta varabila
            int result;
            //daca e numar, il returneaza functiei principale
            if (int.TryParse(ch.ToString(), out result))
            {
                Console.WriteLine("");
                //retunreaza numarul
                return result;
            }
        }
    }

   Aceasta metoda din clasa DictionaryExemplu, va prelua caracterele introduse de utilizator, iar daca va gasi numar, il va returna functiei Main. Pe acest numar il vom folosi pentru a sti cate elemente va avea dictionarul pe care vrem sa il construim.

    //functia pentru construirea dictionarului
    public void CreeazaDictionar(int numarPersoane)
    {
        catalog = new Dictionary<int, string>();

        //numarul de elemente va fi egal cu numarul primit de la tastura
        for (int i = 0; i < numarPersoane; i++)
        {
            Console.WriteLine("Nume pentru persoana {0}", i);
            string nume = Console.ReadLine();

            //adaugam in dictionar iteratia la care a ajuns i
            //si numele primit de la tastatura la iteratia respectiva
            catalog.Add(i, nume);
        }
        Console.WriteLine("Dictionarul a fost creat.");
    }

   Metoda CreeazaDictionar va primi ca parametru numarul de elemente returnat de functia NumarElemente si care va reprezenta numarul de elemente al dictionarului. Intr-o iteratie, vom adauga cate un element dictionarului catalog cu ajutorul functiei Add (vezi articolul despre Dictionary<K,V>), fara a depasi numarul maxim de elemente,  numarPersoane. Vom afisa un mesaj de confirmare dupa construirea dictionarului.

    //functia salveaza dictionarul intr-un fisier
    public void SalveazaDictionar()
    {
        //creeaza fisierul la calea pe 
        StreamWriter fisierIesire = File.CreateText("C:\\dictionar.txt");

        //parcurgem dictionarul
        foreach (KeyValuePair<int, string> el in catalog)
        {
            //scriere textului in fisier
            fisierIesire.Write("(" +el.Key+",");
            fisierIesire.WriteLine(el.Value+")");
        }

        //inchiderea fisierului
        fisierIesire.Close();

        Console.WriteLine("Dictionarul a fost salvat in fisier text.");
    }

   Metoda SalveazaDictionar va salva dictionarul catalog creat de metoda CreeazaDictionar si cu ajutorul clasei StreamWriter din spatiul de nume System.IO, despre care vom discuta intr-un viitor articol, dictionarul catalog va fi salvat sub forma unui fisier text, la calea data ca parametru metodei CreateText. Daca vom naviga la acea cale, vom gasi un fisier text, cu numele dictionar.txt, care va contine colectia catalog.

    //citeste textul dintr-un fisier
    public void CitesteDictionar()
    {
        //deschidem fisierul pentru a citi din el
        StreamReader fisierIntrare = File.OpenText("C:\\dictionar.txt");

        //definim o variabile string care va parcurge fisierul pana la final
        string x;
        //cat timp linia citita nu este goala
        while ((x = fisierIntrare.ReadLine()) != null)
        {
            //scrie in consola
            Console.WriteLine(x);
        }
        //inchidem fisierul
        fisierIntrare.Close();

        Console.WriteLine("Dictionarul a fost citit din fisierul text.");
    }

   Metoda CitesteDictionar, cu ajutorul clasei StreamReader, din acelasi spatiu de nume, System.IO, va deschide fisierul text a carei cale a fost transmisa ca parametru metodei OpenText, apoi va parcurge fisierul dictionar.txt si va scrie in consola fiecare sir de caractere gasit.

   In metoda Main din clasa Program a proiectului, declaram si instantiem clasa DictionarExemplu:

    DictionarExemplu dictionarExemplu = new DictionarExemplu();

   Preluam numarul de elemente primit de la utilizator:

    int numarElem = dictionarExemplu.NumarElemente();

   Vom transmite numarul functiei responsabila cu crearea dictionarului:

    dictionarExemplu.CreeazaDictionar(numarElem);

   Daca se doreste salvarea dictionarului creat in format txt pe hard:

    dictionarExemplu.SalveazaDictionar();

   Daca se doreste citirea dictionarului din fisierul text in care a fost salvat:

    dictionarExemplu.CitesteDictionar();

   Acesta a fost un exemplu scurt, practic, despre construirea unei colectii – dictionar (puteam alege, foarte simplu, din cele prezentate in articolele precedente, List sau ArrayList) si salvarea ei sub forma unui fisier text, pe hard, intr-o locatie specificata de noi. De asemenea, am construit si o functie care sa citeasca dintr-un fisier text, continutul colectiei noastre.

   In articolul viitor, vom prezenta interfata IEnumerator.

Pentru a descarca in format rar codul integral folosit in articolul curent – click aici!

Category: Uncategorized

Your email address will not be published. Required fields are marked *

*