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
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.