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.