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

Operatii de sortare pe Array

De multe ori in practica stocam diverse date in array-uri. Pe aceste date, pastrate in array-uri avem nevoie sa executam diverse operatii. Printre operatiile cel mai des folosite – cel putin de mine – sunt operatii de sortate. Fie ca avem liste de persoane, liste de produse, liste de stringuri, la un moment dat va trebui sa le asezam (afisam) intr-o anumita ordine.

In urma cu ceva timp am scris despre asta – .Net IComparer – se defineste un CustomComparer care implementeaza interfata IComparer, bla, bla… Nu vreau sa reiau ceea ce am scris in articolul precedent aici. Acum vreau sa dau o alta metoda de a face respectiva sortare, care foloseste tot un iComparer, insa scrierea e mai scurta.

Presupunand ca avem un array de obiecte de tip Person[] oameni = new Person[]{ …. }; putem sa il sortam scriind un comparer inline la modul urmator:

     Array.Sort(oameni, delegate(Person p1, Person p2)
     {
          return p1.Age.CompareTo(p2.Age);
     });

care va sorta lista (array-ul) respectiv dupa varsta persoanelor. E mai simplu, mi se pare mie, ca si scriere decat in articolul anterior?

Codul complet este urmatorul:


Clasa Person este definita astfel:

    public class Person
    {
        private string firstName;
        private string lastName;
        private uint age;

        public Person(string fName, string lName, uint age)
        {
            firstName = fName;
            LastName = lName;
            this.age = age;
        }

        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }

        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }

        public uint Age
        {
            get { return age; }
            set { age = value; }
        }

        public override string ToString()
        {
            return string.Format("{0} {1} - {2}", FirstName, LastName, Age);
        }
    }

Iar in metoda Main creem un array de persoane, pe care il afisam nesortat, il sortam si il afisam inca odata pentru a vedea efetul sortari:

    class Program
    {
        static void Main(string[] args)
        {
            Person[] oameni = new Person[]{
                new Person("Ion", "Popescu", 22),
                new Person("Geo", "Ionescu", 15),
                new Person("Pop", "Vasilescu", 32),
                new Person("Ady", "Georgescu", 28),
                new Person("Ron", "Niculescu", 18),
                new Person("Pan", "Petrescu", 22)
            };

            Array.ForEach<Person>(oameni, p => Console.WriteLine(p));
            //for (int i = 0; i < oameni.Length; i++)
            //    Console.WriteLine(oameni[i]);

            Console.WriteLine("\n\nDupa sortare:\n");
            Array.Sort(oameni, delegate(Person p1, Person p2)
            {
                return p1.Age.CompareTo(p2.Age);
            });

            Array.ForEach<Person>(oameni, p => Console.WriteLine(p));
            //for (int i = 0; i < oameni.Length; i++)
            //    Console.WriteLine(oameni[i]);

            Console.ReadKey();
        }
    }

Acest cod afiseaza:

Ion Popescu - 22
Geo Ionescu - 15
Pop Vasilescu - 32
Ady Georgescu - 28
Ron Niculescu - 18
Pan Petrescu - 22

Dupa sortare:
Geo Ionescu - 15
Ron Niculescu - 18
Pan Petrescu - 22
Ion Popescu - 22
Ady Georgescu - 28
Pop Vasilescu - 32

As vrea sa subliniez modul mai simplu, ca scriere, de afisare a elementelor array-ului:
In loc de:

     for (int i = 0; i < oameni.Length; i++)
         Console.WriteLine(oameni[i]);

am scris mai simplu (sau mai putin):

      Array.ForEach<Person>(oameni, p => Console.WriteLine(p));

Array.ForEach<(Of <(T>)>) primeste doi parametri:

public static void ForEach<T>(
    T[] array,
    Action<T> action
)

: arrayul pe care lucram si un delegate Action<(Of <(T>)>) Delegate unde specificam actiunea pe care o executam asupra fiecarui element din Array.

Category: Uncategorized

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

*