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ę.
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 ListPobierzPrzykladowe() { return new List { 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
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:
class Program { static void Main(string[] args) { Listlista = 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 tanie = delegate(Produkt p) { return p.Cena < 4.0m; }; List pasuja = lista.FindAll(tanie); Action 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 { 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
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.