Press "Enter" to skip to content

c# like a perl

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 List PobierzPrzykladowe() 
        {
            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)
        {
            List 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 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

  1. adminka adminka

    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.