using System.Collections.Generic;
Przykład bazuje na klasie implementującej interfejs:
interface ITowar { string Nazwa { get; set; } double Cena { get; set; } int IloscWMagazynie { get; set; } }
Implementacja tej klasy:
class Towar : ITowar { public string ID { get; set; } public string Nazwa { get; set; } public double Cena { get; set; } public int IloscWMagazynie { get; set; } public override string ToString() { return string.Format("{0} {1,-10} {2,5:F2} {3,4}", ID, Nazwa, Cena, IloscWMagazynie); } }
Do przechowywania i zarządzania kolekcją obiektów ITowar wykorzystana zostanie tzw. lista generyczna:
List<ITowar> lista = new List<ITowar>();
Klasa Lista posiada metodę Sort, która będzie wymagać parametru w postaci obiektu implementującego interfejs IComparer<ITowar>.
Zadanie polega na przygotowaniu trzech klas implementujących interfejs IComparer<ITowar>, które umożliwią sortowanie listy towarów na trzy sposoby. Dwa sortowania wg pojedynednego kryterium: wg nazwy, wg ceny. Oraz sortowanie nieco bardziej zaawansowane wg nazwy oraz wg ceny.
Oto one:
class WgNazwy : IComparer<ITowar> { public int Compare(ITowar x, ITowar y) { return string.Compare(x.Nazwa, y.Nazwa); } }
class WgCeny : IComparer<ITowar> { public int Compare(ITowar x, ITowar y) { if (x.Cena < y.Cena) return -1; else if (x.Cena > y.Cena) return 1; else return 0; } }
class WgNazawy_i_Ceny : IComparer<ITowar> { public int Compare(ITowar x, ITowar y) { int si = string.Compare(x.Nazwa, y.Nazwa); if (si == 0) { if (x.Cena < y.Cena) return -1; else if (x.Cena > y.Cena) return 1; else return 0; } else return si; } }
Do testowania można przygotować formularz z trzema przyciskami Button i jedną kontrolką typu ListBox.
W kodzie formularza zadeklarowano pole:
List<ITowar> lista = new List<ITowar>();
... oraz pomocniczo:
Random rnd = new Random(); string[] towary = new string[] { "Chleb", "Bułka", "Masło", "Makaron", "Konserwa" };
Pierwszy przycisk służy do zainicjowania listy towarów i jej prezentacji w kontrolce ListBox:
private void btnLosuj_Click(object sender, EventArgs e) { listBox1.DataSource = null; lista.Clear(); for (int i = 0; i < 15; i++) { string aID = (i + 1).ToString("d5"); string aNazwa = towary[rnd.Next(towary.Length)]; double aCena = Math.Round(5 + 10 * rnd.NextDouble(), 2); int aIlosc = 1 + rnd.Next(100); ITowar t = new Towar() { ID = aID, Nazwa = aNazwa, Cena = aCena, IloscWMagazynie = aIlosc }; lista.Add(t); } listBox1.DataSource = lista; }
Pozostałe przyciski służą do wykonania odpowiedniego sortowania prezentacji wyniku w kontrolce ListBox:
private void btnWgNazwy_Click(object sender, EventArgs e) { listBox1.DataSource = null; lista.Sort(new WgNazwy()); listBox1.DataSource = lista; } private void btnWgCeny_Click(object sender, EventArgs e) { listBox1.DataSource = null; lista.Sort(new WgCeny()); listBox1.DataSource = lista; } private void btnWgNazwy_i_Ceny_Click(object sender, EventArgs e) { listBox1.DataSource = null; lista.Sort(new WgNazawy_i_Ceny()); listBox1.DataSource = lista; }