{"id":708,"date":"2014-03-22T19:09:54","date_gmt":"2014-03-22T19:09:54","guid":{"rendered":"http:\/\/piatkosia.k4be.pl\/wordpress\/?p=708"},"modified":"2014-03-22T19:31:50","modified_gmt":"2014-03-22T19:31:50","slug":"c-like-a-perl","status":"publish","type":"post","link":"https:\/\/piatkosia.k4be.pl\/wordpress\/2014\/03\/22\/c-like-a-perl\/","title":{"rendered":"c# like a perl"},"content":{"rendered":"<p>Wielokrotnie s\u0142ysza\u0142am, jak ch\u0142opaki komentowali taki j\u0119zyk jak perl. Jako g\u0142\u00f3wn\u0105 wad\u0119 wymienili mnogo\u015b\u0107 konwencji zapisu pewnych element\u00f3w j\u0119zyka. Prawda jest taka, \u017ce w C# nie jest lepiej. We\u017amy sobie dla przyk\u0142adu tak\u0105 oto klas\u0119.<br \/>\n<!--more--><\/p>\n<pre class=\"brush: csharp; collapse: true\">\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Collections;\r\n\r\nnamespace apeczka\r\n{\r\n    class Produkt\r\n    {\r\n        public String Nazwa \r\n        { \r\n            get; \r\n            private set;\r\n        }\r\n        public Decimal Cena \r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n        public Produkt(string nazwa, decimal cena)\r\n        {\r\n            Cena = cena;\r\n            Nazwa = nazwa;\r\n        }\r\n        Produkt() { }\r\n        public static List<Produkt> PobierzPrzykladowe() \r\n        {\r\n            return new List<Produkt>\r\n            {\r\n                new Produkt(\"Mas\u0142o\", 2.40m),\r\n                new Produkt(\"Cukier\", 3.40m),\r\n                new Produkt(\"Woda\", 4.00m),\r\n                new Produkt{Nazwa=\"Mleko\", Cena=6.10m},\r\n                new Produkt(\"Chleb\", 2.50m),\r\n                new Produkt{Cena=5.50m, Nazwa=\"S\u00f3l\"},\r\n                new Produkt(nazwa: \"Powid\u0142a\", cena: 2.40m),\r\n                new Produkt(cena: 3.40m, nazwa: \"W\u0119dlina\")\r\n                \r\n            };\r\n        }\r\n        public override string ToString()\r\n        {\r\n            return string.Format(\"{0}: {1} \\n\", Nazwa, Cena);\r\n        }\r\n    }\r\n}\r\n\/\/wszystko co poni\u017cej w tej ramce to syf\r\n<\/pre>\n<p>W funkcji generuj\u0105cej przyk\u0142adow\u0105 list\u0119 produkt\u00f3w widzimy ca\u0142\u0105 gam\u0119 mo\u017cliwo\u015bci stworzenia obiektu. Oczywi\u015bcie wszystkie one dzia\u0142aj\u0105, co mo\u017cna sprawdzi\u0107 umieszczaj\u0105c wywo\u0142anie tej funkcji w klasie wykonywalnej (zwykle Program.cs\/MainPage.cs).<br \/>\nTutaj mam pro\u015bb\u0119 do czytelnik\u00f3w. A mo\u017ce funkcj\u0119 <b>PobierzPrzykladowe<\/b> idzie zapisa\u0107 bardziej nieczytelnie (ofc ka\u017cdy ze sposob\u00f3w jest czytelny, ale za brak ujednolicenia tworzenia obiektu kto\u015b by mi m\u00f3g\u0142 uszy pourywa\u0107)? Jak Ty najcz\u0119\u015bciej tworzysz obiekt\/wywo\u0142ujesz funkcj\u0119?<br \/>\nZabawa listami mo\u017ce by\u0107 ciekawa, chocia\u017cby dlatego, \u017ce przy u\u017cyciu linq mo\u017cemy u\u017cy\u0107  ich tak, jakby lista by\u0142a baz\u0105 danych &#8211; dokonuj\u0105c dowolnej operacji dla niej dost\u0119pnej. Rzu\u0107cie okiem na ten kawa\u0142ek kodu:<\/p>\n<pre class=\"brush: csharp; collapse: true\">\r\n class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            List<Produkt> lista = Produkt.PobierzPrzykladowe();\r\n            Console.WriteLine(\"Nasza lista wygl\u0105da tak:\");\r\n            foreach (Produkt x in lista) Console.Write(x.ToString());\r\n            Console.ReadKey();\r\n            Console.WriteLine(\"A teraz posortowane wg nazwy:\");\r\n            lista.Sort(new PorownywarkaProduktow());\r\n            foreach (Produkt x in lista) Console.Write(x);\r\n            Console.ReadKey();\r\n            Console.WriteLine(\"A teraz wg ceny\");\r\n            foreach (Produkt produkt in lista.OrderBy(p => p.Cena)) Console.Write(produkt);\r\n            Console.ReadKey();\r\n            Console.WriteLine(\"Wy\u015bwietlamy produkty ta\u0144sze od 4 pln:\");\r\n            Predicate<Produkt> tanie = delegate(Produkt p) { return p.Cena < 4.0m; };\r\n            List<Produkt> pasuja = lista.FindAll(tanie);\r\n            Action<Produkt> wyswietl = Console.Write;\r\n            pasuja.ForEach(wyswietl);\r\n            Console.ReadKey();\r\n            Console.WriteLine(\"A teraz dro\u017csze od 4 pln\");\r\n            lista.FindAll(delegate(Produkt p)  { return p.Cena >= 4; }).ForEach(Console.Write);\r\n            Console.ReadKey();\r\n            Console.WriteLine(\"To mo\u017ce ta\u0144sze od 3 pln\");\r\n            foreach (Produkt produkt in lista.Where(p => p.Cena < 3)) Console.Write(produkt);\r\n            Console.ReadKey();\r\n            Console.WriteLine(\"Dro\u017csze od 3\");\r\n            var nietanie = from Produkt p in lista where p.Cena > 3 select p;\r\n            foreach (Produkt produkt in nietanie) Console.Write(produkt);\r\n            Console.ReadKey();\r\n        }\r\n    }\r\n class PorownywarkaProduktow : IComparer<Produkt>\r\n    {\r\n        public int Compare(Produkt x, Produkt y)\r\n        {\r\n            return x.Nazwa.CompareTo(y.Nazwa);\r\n        }\r\n    }\r\n    class PorownywarkaProduktow2 : IComparer\r\n    {\r\n        public int Compare (object x, object y)\r\n        {\r\n            Produkt pierwszy = (Produkt)x;\r\n            Produkt drugi = (Produkt)y;\r\n            return pierwszy.Nazwa.CompareTo(drugi.Nazwa);\r\n        }\r\n    }\r\n\r\n\/\/wszystko co poni\u017cej w tej ramce to syf\r\n<\/pre>\n<p>Mamy tutaj u\u017cyte standardowe wy\u015bwietlanie element\u00f3w listy, sortowanie ich, wy\u015bwietlanie tylko element\u00f3w spe\u0142niaj\u0105cych dane kryteria &#8211; czyli dzia\u0142ania, jakie zwykle wykonujemy na bazach danych. Oki, nie wszystkie zosta\u0142y uj\u0119te. Je\u015bli chodzi o dodanie elementu, by\u0142by to lista.Add(obiekt), usuni\u0119cie wykonuje si\u0119 poleceniem Remove i podobnymi (jak RemoveAll), za\u015b aktualizacja (update) jest dokonywana poprzez odwo\u0142anie si\u0119 do konkretnego obiektu i zmiany warto\u015bci pola\/p\u00f3l obiektu. Niestety, lista ma to do siebie, \u017ce jest ulotna &#8211; ale przecie\u017c to \u017caden problem &#8211; mo\u017cna j\u0105 zserializowa\u0107 spokojnie i wczyta\u0107 po ponownym uruchomieniu aplikacji.<br \/>\nI tak oto si\u0119 zr\u00f3wna\u0142o C# z perlem:) <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wielokrotnie s\u0142ysza\u0142am, jak ch\u0142opaki komentowali taki j\u0119zyk jak perl. Jako g\u0142\u00f3wn\u0105 wad\u0119 wymienili mnogo\u015b\u0107 konwencji zapisu pewnych element\u00f3w j\u0119zyka. Prawda jest taka, \u017ce w C#<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/piatkosia.k4be.pl\/wordpress\/2014\/03\/22\/c-like-a-perl\/\">Lecim dalej<span class=\"screen-reader-text\">c# like a perl<\/span> <i class=\"fas fa-angle-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,83],"tags":[],"class_list":["post-708","post","type-post","status-publish","format-standard","hentry","category-bez-kategorii","category-c_sharp","entry"],"_links":{"self":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/708","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/comments?post=708"}],"version-history":[{"count":4,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/708\/revisions"}],"predecessor-version":[{"id":712,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/708\/revisions\/712"}],"wp:attachment":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=708"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=708"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}