﻿
{"id":3910,"date":"2016-04-06T03:17:26","date_gmt":"2016-04-06T03:17:26","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3910"},"modified":"2017-08-11T00:44:08","modified_gmt":"2017-08-11T00:44:08","slug":"cta-iterator-kavrami-ve-yield-anahtar-sozcugu","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-iterator-kavrami-ve-yield-anahtar-sozcugu\/","title":{"rendered":"C#&#8217;ta Iterator Kavram\u0131 ve yield Anahtar S\u00f6zc\u00fc\u011f\u00fc"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>C#&#8217;ta t\u00fcrl\u00fc t\u00fcrl\u00fc komutlar mevcuttur. Baz\u0131lar\u0131 do\u011fal olarak ilk etaplarda fazla kullan\u0131m alan\u0131n\u0131 sezdirmeselerde, dile olan a\u015final\u0131k ilerledik\u00e7e mant\u0131\u011f\u0131n\u0131 ve varl\u0131\u011f\u0131n\u0131 daha net anlad\u0131\u011f\u0131m\u0131z keywordlerin de\u011feri artmaktad\u0131r. Dilin gramer mant\u0131\u011f\u0131n\u0131 a\u015fabilen yahut tam \u00e7izgisinde seyreden bu komutlar arac\u0131l\u0131\u011f\u0131yla \u015fahsen yapt\u0131\u011f\u0131m\u0131z\u0131n i\u015fin daha \u00e7ok lezzetine vard\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<p>Bu i\u00e7eri\u011fimizde programlamada Iterator kavram\u0131n\u0131 ele alaca\u011f\u0131z ve bu kavram kapsam\u0131nda yield keyword\u00fcn\u00fc irdelemeye \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<h3>\u0130terasyon(Iterator) Kavram\u0131<\/h3>\n<p>Mant\u0131ksal a\u00e7\u0131dan her tahminin alt\u0131nda iterasyon mant\u0131\u011f\u0131 devrededir. \u00d6rne\u011fin, &#8220;1, 3, 5&#8221; dedikten sonra &#8220;7&#8221; diyorsak bu bir iterasyondur. Ba\u015fka bir \u00f6rnek vermek gerekirse, f(5) = 10, f(10) = 20 ise f(20) = ? sorusuna 40 cevab\u0131n\u0131 veriyorsan\u0131z bu tarz d\u00fc\u015f\u00fcnmekte bir iterasyondur.<\/p>\n<p>Dil bilimine g\u00f6re ise, bir hecenin tekrarlanmas\u0131(mermer gibi), bir c\u00fcmlenin i\u00e7inde bir kelimenin tekrarlanmas\u0131(&#8220;A\u011fla \u00e7oban a\u011fla, ovan kalmad\u0131&#8221; gibi) durumlar\u0131 iterasyon \u00e7er\u00e7evesinde d\u00fc\u015f\u00fcn\u00fclebilir.<\/p>\n<p>Ee haliyle bilgisayar biliminde ise bir d\u00f6ng\u00fcdeki her ge\u00e7i\u015f, d\u00f6ng\u00fc, ad\u0131m vs. iterasyon kavram\u0131yla a\u00e7\u0131klanabilir. Yani k\u0131saca \u00e7\u00f6z\u00fcme giden her bir ad\u0131mda iterasyon mevzu bahistir.<\/p>\n<h3>Peki C#&#8217;ta \u0130terasyon Ne \u0130\u015fe Yar\u0131yor?<\/h3>\n<p>Iterator dedi\u011fimiz yap\u0131lar, diziler yahut koleksiyonlar \u00fczerinde yield anahtar s\u00f6zc\u00fc\u011f\u00fc arac\u0131l\u0131\u011f\u0131yla iterasyon yapmam\u0131z\u0131 sa\u011flayan yani \u00e7\u00f6z\u00fcme gidecek olan ad\u0131mlar\u0131 olu\u015fturmam\u0131z\u0131 sa\u011flayan yap\u0131lard\u0131r.<\/p>\n<p>C#&#8217;ta iterator dendi\u011finde akla foreach d\u00f6ng\u00fcs\u00fc gelmektedir. \u00c7\u00fcnk\u00fc foreach d\u00f6ng\u00fcs\u00fc arka planda bir iterator yap\u0131s\u0131n\u0131 kullanmaktad\u0131r. foreach d\u00f6ng\u00fcs\u00fc verilen koleksiyon veya dizi i\u00e7erisindeki elemanlar\u0131 iterator sayesinde tek tek elde etmektedir.<\/p>\n<p>foreach d\u00f6ng\u00fcs\u00fc, yap\u0131s\u0131 gere\u011fi IEnumerable, IEnumerator, IEnumerable&lt;T&gt; veya IEnumerator&lt;T&gt; aray\u00fczlerinden t\u00fcremi\u015f elemanlar \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmekteyiz. Haliyle iterasyon yaratmak i\u00e7in bu interfaceleri d\u00f6n\u00fc\u015f tipi olarak kullanmal\u0131y\u0131z.<\/p>\n<h3>yield Anahtar S\u00f6zc\u00fc\u011f\u00fc Nedir? Ne \u0130\u015f Yapar? Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>yield anahtar s\u00f6zc\u00fc\u011f\u00fc, foreach blo\u011funa subroutine yani altyordam muamelesi yapan, g\u00fczel bir keywordd\u00fcr. yield keyword\u00fc, a\u015fa\u011f\u0131da verilen \u00fc\u00e7 fonksiyonu e\u011fer foreach d\u00f6ng\u00fcs\u00fcnde kullan\u0131lacaklarsa \u00f6zde\u015f hale getirmi\u015ftir.<\/p>\n<p>1. Fonksiyon<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static public IEnumerable&lt;string&gt; VerileriGetir()\r\n        {\r\n            string&#x5B;] Gunler = { &quot;Pazartesi&quot;, &quot;Sal\u0131&quot;, &quot;\u00c7ar\u015famba&quot;, &quot;Per\u015fembe&quot;, &quot;Cuma&quot;, &quot;Cumartesi&quot;, &quot;Pazar&quot; };\r\n            List&lt;string&gt; gunler = new List&lt;string&gt;();\r\n            foreach (var Gun in Gunler)\r\n                gunler.Add(Gun);\r\n            return gunler;\r\n        }\r\n<\/pre>\n<p>2. Fonksiyon<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static public IEnumerable&lt;string&gt; VerileriGetir2()\r\n        {\r\n            string&#x5B;] Gunler = { &quot;Pazartesi&quot;, &quot;Sal\u0131&quot;, &quot;\u00c7ar\u015famba&quot;, &quot;Per\u015fembe&quot;, &quot;Cuma&quot;, &quot;Cumartesi&quot;, &quot;Pazar&quot; };\r\n            foreach (var Gun in Gunler)\r\n                yield return Gun;\r\n        }\r\n<\/pre>\n<p>3. Fonksiyon<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static public IEnumerable&lt;string&gt; VerileriGetir3()\r\n        {\r\n            yield return &quot;Pazartesi&quot;;\r\n            yield return &quot;Sal\u0131&quot;;\r\n            yield return &quot;\u00c7ar\u015famba&quot;;\r\n            yield return &quot;Per\u015fembe&quot;;\r\n            yield return &quot;Cuma&quot;;\r\n            yield return &quot;Cumartesi&quot;;\r\n            yield return &quot;Pazar&quot;;\r\n        }\r\n<\/pre>\n<p>Yukar\u0131da tan\u0131mlanm\u0131\u015f \u00fc\u00e7 adet fonksiyonun kullan\u0131m\u0131,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            foreach (var Gun in VerileriGetir())\r\n                Console.WriteLine(Gun);\r\n\r\n            Console.WriteLine(&quot;*************&quot;);\r\n\r\n            foreach (var Gun in VerileriGetir2())\r\n                Console.WriteLine(Gun);\r\n\r\n            Console.WriteLine(&quot;*************&quot;);\r\n\r\n            foreach (var Gun in VerileriGetir3())\r\n                Console.WriteLine(Gun);\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-iterator-kavrami-ve-yield-anahtar-sozcugu\/cta-iterator-kavrami-ve-yield-anahtar-sozcugu\/\" rel=\"attachment wp-att-3933\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3933\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-Iterator-Kavram\u0131-ve-yield-Anahtar-S\u00f6zc\u00fc\u011f\u00fc.png\" alt=\"C#'ta Iterator Kavram\u0131 ve yield Anahtar S\u00f6zc\u00fc\u011f\u00fc\" width=\"112\" height=\"403\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-Iterator-Kavram\u0131-ve-yield-Anahtar-S\u00f6zc\u00fc\u011f\u00fc.png 112w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-Iterator-Kavram\u0131-ve-yield-Anahtar-S\u00f6zc\u00fc\u011f\u00fc-83x300.png 83w\" sizes=\"auto, (max-width: 112px) 100vw, 112px\" \/><\/a><br \/>\nyield keyword\u00fcn\u00fcn burada nas\u0131l bir rol ald\u0131\u011f\u0131n\u0131 konu\u015fal\u0131m.<\/p>\n<p>yield anahtar s\u00f6zc\u00fc\u011f\u00fc, IEnumerable, IEnumerator, IEnumerable&lt;T&gt; veya IEnumerator&lt;T&gt; interface tiplerinde de\u011fer d\u00f6n\u00fclen durumlarda birden fazla geriye de\u011fer d\u00f6nd\u00fcrebilmektedir. Normal \u015fartlarda var olan bilgimize g\u00f6re return komutunu yukar\u0131daki 3. \u00f6rnekte oldu\u011fu gibi kullanamad\u0131\u011f\u0131m\u0131z\u0131 biliyoruz. O halde yield keyword\u00fcn\u00fcn sihri burada sakl\u0131 olsa gerek.<\/p>\n<p>Compiler yield anahtar s\u00f6zc\u00fc\u011f\u00fcn\u00fc g\u00f6rd\u00fc\u011f\u00fc anda bu keyword\u00fcn bulundu\u011fu blo\u011fun bir iterator blo\u011fu oldu\u011funu alg\u0131lamaktad\u0131r. Bu ad\u0131mdan sonra foreach d\u00f6ng\u00fcs\u00fc i\u00e7erisinde ilgili koleksiyonu d\u00f6nen metod \u00e7a\u011fr\u0131ld\u0131ktan sonra metod i\u00e7erisindeki bir yield return ifadesine gelinince de\u011fer geriye d\u00f6n\u00fclmekte ve bu i\u015flem yap\u0131lmadan \u00f6nce Compiler, iterator metodun kald\u0131\u011f\u0131 yeri saklamaktad\u0131r. S\u00fcre\u00e7 esnas\u0131nda foreach d\u00f6ng\u00fcs\u00fcnde iterator metoduna gelen her istekte iterator metot ba\u015ftan ba\u015flamak yerine kald\u0131\u011f\u0131 yerden i\u015fletilmektedir.<\/p>\n<p>\u0130\u015fte yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz i\u015flem yield keyword\u00fc sayesinde bu mant\u0131kla ger\u00e7ekle\u015fmektedir.<\/p>\n<p>yield anahtar s\u00f6zc\u00fc\u011f\u00fcn\u00fc a\u015fa\u011f\u0131daki gibi iki farkl\u0131 \u015fekilde kullanabilmekteyiz.<\/p>\n<ul>\n<li><span style=\"color: #ff6600;\"><em><strong>yield return <span style=\"color: #0000ff;\">[value]<\/span><\/strong><\/em><\/span><\/li>\n<li><span style=\"color: #ff6600;\"><em><strong>yield break<\/strong><\/em><\/span><\/li>\n<\/ul>\n<p>&#8220;yield return [value]&#8221; kullan\u0131m\u0131 ile yukar\u0131daki \u00f6rneklendirmemizde oldu\u011fu gibi \u00e7al\u0131\u015fabilmekteyiz. Lakin &#8220;yield break&#8221; ifadesi ile iterator i\u00e7erisindeki iterasyonun sona erdi\u011fi bilgisi ilgili foreach d\u00f6ng\u00fcs\u00fcne bildirilmektedir. A\u015fa\u011f\u0131daki kod par\u00e7ac\u0131\u011f\u0131 bu durumu \u00f6rneklendirmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static public IEnumerable&lt;string&gt; VerileriGetir()\r\n        {\r\n            yield return &quot;Pazartesi&quot;;\r\n            yield return &quot;Sal\u0131&quot;;\r\n            yield return &quot;\u00c7ar\u015famba&quot;;\r\n            yield return &quot;Per\u015fembe&quot;;\r\n            yield return &quot;Cuma&quot;;\r\n            yield return &quot;Cumartesi&quot;;\r\n            yield break;\r\n            yield return &quot;Pazar&quot;;\r\n        }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            foreach (var Gun in VerileriGetir())\r\n                Console.WriteLine(Gun);\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>&#8220;yield break&#8221; ifadesinden dolay\u0131 ilgili foreach iterasyonun sona erdi\u011fini bilecek ve &#8220;Pazar&#8221; de\u011ferini yazd\u0131rmayacakt\u0131r.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/cta-iterator-kavrami-ve-yield-anahtar-sozcugu\/cta-iterator-kavrami-ve-yield-anahtar-sozcugu-2\/\" rel=\"attachment wp-att-3940\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Cta-Iterator-Kavram\u0131-ve-yield-Anahtar-S\u00f6zc\u00fc\u011f\u00fc-1.png\" alt=\"C#&#039;ta Iterator Kavram\u0131 ve yield Anahtar S\u00f6zc\u00fc\u011f\u00fc\" width=\"88\" height=\"115\" class=\"aligncenter size-full wp-image-3940\" \/><\/a><\/p>\n<p>Son olarak, yield keyword\u00fc kullan\u0131lan iterator bir metot, foreach i\u00e7in evaluate edilmedi\u011fi s\u00fcrece yield komutu ilgili metodu \u00e7al\u0131\u015ft\u0131rmayacakt\u0131r.<br \/>\n\u00d6rnek olarak tekrar a\u015fa\u011f\u0131daki metodu ele alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static public IEnumerable&lt;string&gt; VerileriGetir()\r\n        {\r\n            yield return &quot;Pazartesi&quot;;\r\n            yield return &quot;Sal\u0131&quot;;\r\n            yield return &quot;\u00c7ar\u015famba&quot;;\r\n            yield return &quot;Per\u015fembe&quot;;\r\n            yield return &quot;Cuma&quot;;\r\n            yield return &quot;Cumartesi&quot;;\r\n            yield return &quot;Pazar&quot;;\r\n        }\r\n<\/pre>\n<p>\u015eimdi a\u015fa\u011f\u0131daki kod blo\u011funu detayl\u0131ca inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            IEnumerable&lt;string&gt; Veriler = VerileriGetir();\r\n\r\n            foreach (var item in Veriler)\r\n                Console.WriteLine(item);\r\n        }\r\n<\/pre>\n<p>Bu \u00f6rnekte &#8220;Veriler&#8221; de\u011fi\u015fkeninin i\u00e7inde foreach d\u00f6ng\u00fcs\u00fcne gelmeden \u00f6nce hi\u00e7bir\u015fey olmayacakt\u0131r. Ne zaman ki d\u00f6ng\u00fcye girilecek, o zaman VerileriGetir metodu \u00e7al\u0131\u015ft\u0131r\u0131lacakt\u0131r. Yani istemci taraf\u0131ndan ne zaman foreach d\u00f6ng\u00fcs\u00fcyle \u00e7a\u011fr\u0131l\u0131rsa bir anlamda yield lazy loading yapm\u0131\u015f olacakt\u0131r.<\/p>\n<blockquote><p>yield anahtar s\u00f6zc\u00fc\u011f\u00fc Lazy Loading yapar.<\/p><\/blockquote>\n<p>Bu durumu a\u015fa\u011f\u0131daki videodan net bir \u015fekilde izleyebilirsiniz.<br \/>\n<iframe loading=\"lazy\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/UZU8dGo5LiE\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, C#&#8217;ta t\u00fcrl\u00fc t\u00fcrl\u00fc komutlar mevcuttur. Baz\u0131lar\u0131 do\u011fal olarak ilk etaplarda fazla kullan\u0131m alan\u0131n\u0131 sezdirmeselerde, dile olan a\u015final\u0131k ilerledik\u00e7e mant\u0131\u011f\u0131n\u0131 ve varl\u0131\u011f\u0131n\u0131 daha net anlad\u0131\u011f\u0131m\u0131z keywordlerin de\u011feri artmaktad\u0131r. Dilin gramer mant\u0131\u011f\u0131n\u0131 a\u015fabilen yahut tam&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,338,720],"tags":[27,1043,1044,1042,1039,1040,1046,1045,1041],"class_list":["post-3910","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-5-0","category-c-6-0","tag-c","tag-ienumerable","tag-ienumerator","tag-iterasyon","tag-iterasyon-kavrami","tag-iterator","tag-lazy-loading","tag-subroutine","tag-yield"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=3910"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3910\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}