﻿
{"id":25076,"date":"2022-05-20T09:42:33","date_gmt":"2022-05-20T09:42:33","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=25076"},"modified":"2022-05-20T09:42:33","modified_gmt":"2022-05-20T09:42:33","slug":"c-11-list-and-range-pattern","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-11-list-and-range-pattern\/","title":{"rendered":"C# 11 &#8211; List and Slice Pattern"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>G\u00fcn ge\u00e7miyor ki, C# yeteneklerine yeni bir nitelik kazand\u0131rmas\u0131n \ud83d\ude42 Bu i\u00e7eri\u011fimizde, C# 11 ile gelen \u00f6zellikler aras\u0131nda nacizane olarak olduk\u00e7a kullan\u0131\u015fl\u0131 g\u00f6rd\u00fc\u011f\u00fcm List Pattern \u00fczerine odaklanacak ve gelen bu yenili\u011fin t\u00fcm \u00f6zelliklerini de\u011ferlendiriyor olaca\u011f\u0131z.<\/p>\n<p>List Pattern, elimizdeki List koleksiyonlar\u0131n\u0131n ya da dizilerinin de\u011ferlerini farkl\u0131 bir diziyle e\u015fle\u015ftirebilmemizi ve bu e\u015fle\u015ftirme neticesinde sonucu boolean olarak edinebilmemizi sa\u011flayarak \u015fartl\u0131 kodlarda \u00fcst d\u00fczey yakla\u015f\u0131m sergilememize olanak tan\u0131yan bir yeniliktir.<\/p>\n<p>Bu pattern&#8217;a dair daha detayl\u0131 konu\u015fabilmek i\u00e7in \u00f6ncelikle a\u015fa\u011f\u0131daki \u00f6rnekler \u00fczerinden konuyu somutla\u015ft\u0131rarak mevzuya girelim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint&#x5B;] array = { 1, 2, 3 };\r\n\r\nConsole.WriteLine(array is &#x5B;1, 2, 3]);  \/\/true\r\nConsole.WriteLine(array is &#x5B;1]);        \/\/false\r\nConsole.WriteLine(array is &#x5B;1, 2]);     \/\/false\r\nConsole.WriteLine(array is &#x5B;3, 4, 5]);  \/\/false\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer 1. sat\u0131rda tan\u0131mlanan dizi(esas\u0131nda bir koleksiyonda olabilirdi) alt sat\u0131rlarda <code>is<\/code> operat\u00f6r\u00fc e\u015fli\u011finde farkl\u0131 dizisel de\u011ferlerle kar\u015f\u0131la\u015ft\u0131r\u0131lmakta ve sonu\u00e7 boolean olarak elde edilmektedir.<\/p>\n<p>\u0130\u015fte bu list pattern&#8217;\u0131n ta kendisidir. Dikkat ederseniz, ilgili pattern&#8217;\u0131 uygulayabilmek i\u00e7in k\u00f6\u015feli parantezler <code>[<\/code><code>]<\/code> semantik olarak bizlere e\u015flik etmektedir.<\/p>\n<p>Bu \u015fekilde bir kullan\u0131mla ilgili koleksiyonun k\u00fcm\u00fclatif olarak verilen diziyle ayn\u0131 olup olmad\u0131\u011f\u0131 kontrol edilmektedir. Halbuki bizler koleksiyon i\u00e7erisinde verilen de\u011ferlerin olup olmad\u0131\u011f\u0131n\u0131 yahut s\u0131ra g\u00f6zetmeksizin farkl\u0131 verilerin varl\u0131\u011f\u0131n\u0131 kontrol etmek isteyebiliriz. \u0130\u015fte b\u00f6yle bir durumda a\u015fa\u011f\u0131daki gibi <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-7-0-discard-kavrami\/\" rel=\"noopener\" target=\"_blank\">discard<\/a> operat\u00f6r\u00fcnden de istifade edebilmekteyiz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint&#x5B;] array = { 1, 2, 3 };\r\n\r\nConsole.WriteLine(array is &#x5B;_, 2, _]);          \/\/true\r\nConsole.WriteLine(array is &#x5B;_, 1, _]);          \/\/false\r\nConsole.WriteLine(array is &#x5B;1, 2, _]);          \/\/true\r\nConsole.WriteLine(array is &#x5B;_, _, _, 3, 4, 5]); \/\/false\r\nConsole.WriteLine(array is &#x5B;_, _, _]);          \/\/true\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere discard operat\u00f6r\u00fc ile bir nebze koleksiyon verilerinin kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131nda esneklik sa\u011flam\u0131\u015f olsak da hala de\u011ferlendirmenin s\u0131ral\u0131 bir \u015fekilde olmas\u0131ndan kurtulabilmi\u015f de\u011filiz. Bunun i\u00e7in a\u015fa\u011f\u0131daki gibi <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-8-0-ranges-and-indices\/\" rel=\"noopener\" target=\"_blank\">slice<\/a> pattern&#8217;dan da faydalanabiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint&#x5B;] array = { 1, 2, 3 };\r\n\r\nConsole.WriteLine(array is &#x5B;_, .., 2, _]);      \/\/true\r\nConsole.WriteLine(array is &#x5B;1, 2, ..]);         \/\/true\r\nConsole.WriteLine(array is &#x5B;_, .., _, 3, 4, 5]);\/\/false\r\nConsole.WriteLine(array is &#x5B;_, _, _]);          \/\/true\r\nConsole.WriteLine(array is &#x5B;..]);               \/\/true\r\n<\/pre>\n<\/div>\n<p>Slice pattern&#8217;da kullan\u0131lan range operat\u00f6r\u00fc sayesinde s\u0131ralaman\u0131n herhangi bir yerinde istenilen de\u011fere kar\u015f\u0131l\u0131k de\u011ferlendirme yap\u0131labilir ya da kaynak koleksiyondaki veri say\u0131s\u0131yla\/uzunlu\u011fuyla ilgilenilmedi\u011fi taktirde yine bu range pattern&#8217;dan istifade edilebilir.<\/p>\n<p>Bu arada unutulmamal\u0131d\u0131r ki, slice pattern bir dizi i\u00e7erisinde yaln\u0131zca tek bir kez kullan\u0131lmakta aksi taktirde derleyici hatas\u0131 al\u0131nmaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern.png\" alt=\"C# 11 - List and Slice Pattern\" width=\"481\" height=\"126\" class=\"aligncenter size-full wp-image-25087\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern.png 481w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern-300x79.png 300w\" sizes=\"auto, (max-width: 481px) 100vw, 481px\" \/><\/a>Esas\u0131nda \u015fuana kadar yapt\u0131\u011f\u0131m\u0131z t\u00fcm \u00f6rneklendirmelerde list pattern i\u00e7erisinde sabit de\u011ferler kulland\u0131\u011f\u0131m\u0131zdan dolay\u0131 fark\u0131nda olmadan <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-7-0-pattern-matching\/\" rel=\"noopener\" target=\"_blank\">constant pattern<\/a> kullanm\u0131\u015f bulunmaktay\u0131z. Normal \u015fartlarda bu sabitli\u011fe olan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 de\u011fi\u015ftirebilir ve <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-9-0-pattern-matching-enhancements\/\" rel=\"noopener\" target=\"_blank\">relational pattern<\/a> gibi kal\u0131plar\u0131 da uygulayabiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint&#x5B;] array = { 1, 2, 3 };\r\n\r\nConsole.WriteLine(array is &#x5B;_, &gt;= 2, &lt; (3 * 5)]);   \/\/true\r\nConsole.WriteLine(array is &#x5B;_, .., &lt; (3 * 5)]);     \/\/true\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere list pattern, \u00f6zellikle elimizdeki koleksiyonel verilerde yap\u0131 d\u00fczenini g\u00f6zetmeksizin yap\u0131lacak kar\u015f\u0131la\u015ft\u0131rmalarda olduk\u00e7a etkili bir \u00f6zelliktir. Nihayetinde elimizdeki koleksiyondan verileri bir objeye d\u00f6n\u00fc\u015ft\u00fcrme gere\u011fi duymaks\u0131z\u0131n direkt olarak bu pattern sayesinde h\u0131zl\u0131ca kontrollerimizi sa\u011flayabilir ve operasyonlar\u0131m\u0131z\u0131 ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<p>\u015eimdi son olarak Microsoft&#8217;un d\u00f6k\u00fcmanlar\u0131nda<span style=\"font-size:12px;\">(bknz : <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/csharp\/language-reference\/operators\/patterns#list-patterns\" rel=\"noopener\" target=\"_blank\">list patterns<\/a>)<\/span> konuya dair olduk\u00e7a g\u00fczel bir \u00f6rne\u011fi burada modelleyip ard\u0131ndan i\u00e7eri\u011fimizi sonland\u0131ral\u0131m istiyorum.<\/p>\n<p>Bir bankada, herhangi bir m\u00fc\u015fterinin belirli tarihler aral\u0131\u011f\u0131ndaki i\u015flem bilgilerini i\u00e7eren metin dosyas\u0131n\u0131n a\u015fa\u011f\u0131daki \u015fekilde al\u0131nt\u0131land\u0131\u011f\u0131n\u0131 varsayal\u0131m.<\/p>\n<table>\n<thead>\n<tr>\n<th>Tarih<\/th>\n<th>\u0130\u015flem<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<th>Kime<\/th>\n<th>\u00dccret<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>18.05.2022<\/td>\n<td>FAST<\/td>\n<td>Deposito \u00f6deme<\/td>\n<td>Hilmi Celayir<\/td>\n<td>1500\u20ba<\/td>\n<\/tr>\n<tr>\n<td>12.05.2022<\/td>\n<td>FAST<\/td>\n<td>Apartman aidat<\/td>\n<td>Faruk Eczaneci<\/td>\n<td>50\u20ba<\/td>\n<\/tr>\n<tr>\n<td>10.05.2022<\/td>\n<td>EFT<\/td>\n<td>Mutfak dolab\u0131 taksidi<\/td>\n<td><\/td>\n<td>1050\u20ba<\/td>\n<\/tr>\n<tr>\n<td>09.05.2022<\/td>\n<td>EFT<\/td>\n<td>Sigorta \u00f6demesi<\/td>\n<td><\/td>\n<td>850\u20ba<\/td>\n<\/tr>\n<tr>\n<td>09.05.2022<\/td>\n<td>FAST<\/td>\n<td>K\u00f6y sand\u0131\u011f\u0131<\/td>\n<td>Cemil Y\u0131lmaz<\/td>\n<td>50\u20ba<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Yukar\u0131daki veri k\u00fcmesine g\u00f6z atarsan\u0131z e\u011fer ilgili m\u00fc\u015fterinin yapt\u0131\u011f\u0131 t\u00fcm para transferlerini g\u00f6rmekteyiz. Burada para transferini ger\u00e7ekle\u015ftiren m\u00fc\u015fterimiz ise transferin ger\u00e7ekle\u015ftirildi\u011fi ki\u015finin &#8216;Kime&#8217; kolonunda ismi yaz\u0131l\u0131yorken, d\u0131\u015far\u0131dan m\u00fc\u015fteriye ger\u00e7ekle\u015ftiriliyorsa e\u011fer o zaman bo\u015f b\u0131rak\u0131lmakta, herhangi bir veri yaz\u0131lmamaktad\u0131r. Para transferi s\u00fcrecinde &#8216;FAST&#8217;te %2, &#8216;EFT&#8217;de ise %3 komisyon al\u0131nd\u0131\u011f\u0131n\u0131 varsayarsak e\u011fer b\u00f6yle bir veri k\u00fcmesi \u00fczerinde list pattern e\u015fli\u011finde, discard pattern, constant pattern ve <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-7-0-pattern-matching\/\" rel=\"noopener\" target=\"_blank\">var pattern<\/a>&#8216;\u0131 a\u015fa\u011f\u0131daki gibi kullan\u0131p toplam bakiyeyi a\u015fa\u011f\u0131daki gibi hesaplayabiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nobject&#x5B;] bankProcess1 = { &quot;18.05.2022&quot;, &quot;FAST&quot;, &quot;Deposito \u00f6deme&quot;, &quot;Hilmi Celayir&quot;, 1500 };\r\nobject&#x5B;] bankProcess2 = { &quot;12.05.2022&quot;, &quot;FAST&quot;, &quot;Apartman aidat&quot;, &quot;Faruk Eczaneci&quot;, 50 };\r\nobject&#x5B;] bankProcess3 = { &quot;10.05.2022&quot;, &quot;EFT&quot;, &quot;Mutfak dolab\u0131 taksidi&quot;, 1050 };\r\nobject&#x5B;] bankProcess4 = { &quot;09.05.2022&quot;, &quot;EFT&quot;, &quot;Sigorta \u00f6demesi&quot;, 850 };\r\nobject&#x5B;] bankProcess5 = { &quot;09.05.2022&quot;, &quot;FAST&quot;, &quot;K\u00f6y sand\u0131\u011f\u0131&quot;, &quot;Cemil Y\u0131lmaz&quot;, 50 };\r\n\r\nList&lt;object&#x5B;]&gt; bankProcesses = new() { bankProcess1, bankProcess2, bankProcess3, bankProcess4, bankProcess5 };\r\n\r\nfloat balance = 0;\r\nforeach (object&#x5B;] bankProcess in bankProcesses)\r\n{\r\n    balance += bankProcess switch\r\n    {\r\n        &#x5B;_, &quot;FAST&quot;, _, _, int amount] =&gt; -(amount + (amount * 2 \/ 100)),\r\n        &#x5B;_, &quot;EFT&quot;, _, _, int amount] =&gt; -(amount + (amount * 3 \/ 100)),\r\n        &#x5B;_, &quot;FAST&quot;, .., int amount] =&gt; amount,\r\n        &#x5B;_, &quot;EFT&quot;, .., int amount] =&gt; amount,\r\n        _ =&gt; 0\r\n    };\r\n}\r\nConsole.WriteLine($&quot;Bakiye : {balance}&quot;);\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern-1.png\" alt=\"C# 11 - List and Slice Pattern\" width=\"102\" height=\"22\" class=\"aligncenter size-full wp-image-25100\" \/><\/a>Ayr\u0131ca list pattern&#8217;\u0131 var pattern ile birlikte a\u015fa\u011f\u0131daki gibi kullan\u0131p adedi bilinmeyen t\u00fcm verileri ayr\u0131 bir dizi olarak elde edebilmekteyiz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar array = new&#x5B;] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\r\nif (array is &#x5B;1, 2, .. var vals, 9])\r\n    Console.WriteLine(String.Join(&quot;,&quot;, vals));\r\n\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/C-11-List-and-Slice-Pattern-2.png\" alt=\"C# 11 - List and Slice Pattern\" width=\"90\" height=\"17\" class=\"aligncenter size-full wp-image-25102\" \/><\/a>Yukar\u0131daki kaynak koda g\u00f6z atarsan\u0131z e\u011fer <code>.. var vals<\/code> \u015feklinde iki pattern&#8217;\u0131 kombinlersek e\u011fer bizlere aral\u0131ktaki t\u00fcm de\u011ferleri dizi olarak getirecektir.<\/p>\n<p>Nihai olarak,<br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere list pattern&#8217;\u0131 koleksiyonel veriler \u00fczerinde dizisel e\u015fle\u015ftirme verileriyle g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla kullanabilir ve kodunuza esneklik kazand\u0131rabilirsiniz.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#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, G\u00fcn ge\u00e7miyor ki, C# yeteneklerine yeni bir nitelik kazand\u0131rmas\u0131n \ud83d\ude42 Bu i\u00e7eri\u011fimizde, C# 11 ile gelen \u00f6zellikler aras\u0131nda nacizane olarak olduk\u00e7a kullan\u0131\u015fl\u0131 g\u00f6rd\u00fc\u011f\u00fcm List Pattern \u00fczerine odaklanacak ve gelen bu yenili\u011fin t\u00fcm \u00f6zelliklerini&#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":25103,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,4580],"tags":[4581,4586,4583,4585,4582,4584,4589],"class_list":["post-25076","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-11","tag-c-11","tag-c-11-list-and-slice-pattern","tag-c-11-list-pattern","tag-c-11-slice-pattern","tag-c-11-yenilikleri","tag-list-pattern","tag-slice-pattern"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25076","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=25076"}],"version-history":[{"count":25,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25076\/revisions"}],"predecessor-version":[{"id":25105,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25076\/revisions\/25105"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/25103"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=25076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=25076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=25076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}