Wielokrotnie słyszałam, jak chłopaki komentowali taki język jak perl. Jako główną wadę wymienili mnogość konwencji zapisu pewnych elementów języka. Prawda jest taka, że w C# nie jest lepiej. Weźmy sobie dla przykładu taką oto klasę.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace apeczka { class Produkt { public String Nazwa { get ; private set ; } public Decimal Cena { get ; private set ; } public Produkt( string nazwa, decimal cena) { Cena = cena; Nazwa = nazwa; } Produkt() { } public static List<produkt> PobierzPrzykladowe() { return new List<produkt> { new Produkt( "Masło" , 2.40m), new Produkt( "Cukier" , 3.40m), new Produkt( "Woda" , 4.00m), new Produkt{Nazwa= "Mleko" , Cena=6.10m}, new Produkt( "Chleb" , 2.50m), new Produkt{Cena=5.50m, Nazwa= "Sól" }, new Produkt(nazwa: "Powidła" , cena: 2.40m), new Produkt(cena: 3.40m, nazwa: "Wędlina" ) }; } public override string ToString() { return string .Format( "{0}: {1} \n" , Nazwa, Cena); } } } //wszystko co poniżej w tej ramce to syf </produkt></produkt> |
W funkcji generującej przykładową listę produktów widzimy całą gamę możliwości stworzenia obiektu. Oczywiście wszystkie one działają, co można sprawdzić umieszczając wywołanie tej funkcji w klasie wykonywalnej (zwykle Program.cs/MainPage.cs).
Tutaj mam prośbę do czytelników. A może funkcję PobierzPrzykladowe idzie zapisać bardziej nieczytelnie (ofc każdy ze sposobów jest czytelny, ale za brak ujednolicenia tworzenia obiektu ktoś by mi mógł uszy pourywać)? Jak Ty najczęściej tworzysz obiekt/wywołujesz funkcję?
Zabawa listami może być ciekawa, chociażby dlatego, że przy użyciu linq możemy użyć ich tak, jakby lista była bazą danych – dokonując dowolnej operacji dla niej dostępnej. Rzućcie okiem na ten kawałek kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | class Program { static void Main( string [] args) { List<produkt> lista = Produkt.PobierzPrzykladowe(); Console.WriteLine( "Nasza lista wygląda tak:" ); foreach (Produkt x in lista) Console.Write(x.ToString()); Console.ReadKey(); Console.WriteLine( "A teraz posortowane wg nazwy:" ); lista.Sort( new PorownywarkaProduktow()); foreach (Produkt x in lista) Console.Write(x); Console.ReadKey(); Console.WriteLine( "A teraz wg ceny" ); foreach (Produkt produkt in lista.OrderBy(p => p.Cena)) Console.Write(produkt); Console.ReadKey(); Console.WriteLine( "Wyświetlamy produkty tańsze od 4 pln:" ); Predicate<produkt> tanie = delegate (Produkt p) { return p.Cena < 4.0m; }; List<produkt> pasuja = lista.FindAll(tanie); Action<produkt> wyswietl = Console.Write; pasuja.ForEach(wyswietl); Console.ReadKey(); Console.WriteLine( "A teraz droższe od 4 pln" ); lista.FindAll( delegate (Produkt p) { return p.Cena >= 4; }).ForEach(Console.Write); Console.ReadKey(); Console.WriteLine( "To może tańsze od 3 pln" ); foreach (Produkt produkt in lista.Where(p => p.Cena < 3)) Console.Write(produkt); Console.ReadKey(); Console.WriteLine( "Droższe od 3" ); var nietanie = from Produkt p in lista where p.Cena > 3 select p; foreach (Produkt produkt in nietanie) Console.Write(produkt); Console.ReadKey(); } } class PorownywarkaProduktow : IComparer<produkt> { public int Compare(Produkt x, Produkt y) { return x.Nazwa.CompareTo(y.Nazwa); } } class PorownywarkaProduktow2 : IComparer { public int Compare ( object x, object y) { Produkt pierwszy = (Produkt)x; Produkt drugi = (Produkt)y; return pierwszy.Nazwa.CompareTo(drugi.Nazwa); } } //wszystko co poniżej w tej ramce to syf </produkt></produkt></produkt></produkt></produkt> |
Mamy tutaj użyte standardowe wyświetlanie elementów listy, sortowanie ich, wyświetlanie tylko elementów spełniających dane kryteria – czyli działania, jakie zwykle wykonujemy na bazach danych. Oki, nie wszystkie zostały ujęte. Jeśli chodzi o dodanie elementu, byłby to lista.Add(obiekt), usunięcie wykonuje się poleceniem Remove i podobnymi (jak RemoveAll), zaś aktualizacja (update) jest dokonywana poprzez odwołanie się do konkretnego obiektu i zmiany wartości pola/pól obiektu. Niestety, lista ma to do siebie, że jest ulotna – ale przecież to żaden problem – można ją zserializować spokojnie i wczytać po ponownym uruchomieniu aplikacji.
I tak oto się zrównało C# z perlem:)
One Comment
sorry, coś nie wiadomo czemu wtyczka jak na złość uważa zwykle oznaczenie typu z templejtu jako tag htmlowy – zmiana na symbol zastępczy ze względu na znacznik pre nie jest interpretowana. W związku z tym końcówkę musicie przy testowaniu kodu po prostu wyciąć. Ja już nie mam siły do tego – a rzygam technologiami webowymi – więc wtyczki modyfikować nie będę. Zawsze możesz wyłączyć jsa (ale stracisz kolorki i numerowanie)
Comments are closed.