C# for ve foreach döngüsü arasındaki farklar

Bu makalede C# ile for ve foreach döngüleri arasındaki farkları inceleyeceğiz.

Böylece #1 numaralı istek makaleyi yazmış olacağım :)

Not : Issues sayfasında varolan makale isteklerini görebileceğinizi, hatta yeni makale isteğinde bulunabileceğinizi biliyor muydunuz?

Öncelikle for ve foreach döngülerini C# programlama dilinde nasıl kullanıyoruz, nasıl yazıyoruz, hemen hatırlayalım;

for döngüsünün özelliği, bir başlangıç noktasından bir bitiş noktasına doğru, istediğimiz adım aralığında ilerleyebilmesidir.

Örneğin, Nisan ayının günlerini ekranda göstermek istersek aşağıdaki gibi 0..30 arasında sırasıyla ilerleyen bir döngü oluşturabiliriz;

Eğer olimpiyatların hangi tarihlerde gerçekleştirildiğini ekranda göstermemiz gerekiyorsa, aşağıdaki örnekte olduğu gibi, dizi değişkeninin başlangıç değerini ilk olimpiyatın yapıldığı 1896 yılına ayarlar, döngünün bulunduğumuz yıla kadar (bulunduğumuz yıl dahil) sürmesini sağlar, her 4. yılı elde edebiliriz;

Hatta, istersek for döngüsünün tersten çalışmasını bile sağlayabiliriz;

foreach döngüsünün özelliği, bir listenin üzerinde adım adım ilerleyerek tüm öğelerini bize sadece-okunur olarak sağlamasıdır.

foreach döngüsünde unutulmaması gereken önemli nokta, döngü değişkeninin sadece-okunur (read-only) olmasıdır. Aşağıdaki örnekte olduğu gibi değişkenin değeri üzerinde değişiklik yapamayız;

for döngüleri genellikle bir dizinin öğeleri üzerinde gezinmek için kullanılır. Örneğin;

Bu kod örneğinde, şöyle bir problem var; döngünün ilk adımı gerçekleştikten sonra önce iLoop isimli döngü değişkeninin değeri 1 arttırılacak. Sonra iLoop değişkeninin değeri döngünün sonuna erişilip-erişilmediği belirlensin diye dizideki eleman adedi ile karşılaştırılacak.

Bir sonraki döngü adımının sonunda gene iLoop değişkenin değeri 1 arttırılacak ve döngünün sonuna gelinip-gelinmediğinin belirlenmesi için dizideki eleman adedi ile karşılaştırılacak.

Hatta dizideki eleman adedi ile karşılaştırma her döngü adımında tekrar tekrar yapılacak.

Çok önemli gibi gözükmese de, dizideki eleman adedini döngü öncesi bir değişkene alıp, döngü içerisinde hep bu değişken ile kontrol etmek, performansa olumlu katkı sağlayacaktır.

Not: döngünün başından sonuna kadar dizideki eleman adedinin değişmediğini varsayıyorum

Hatta, madem for döngüsünün ilk parçasında döngü değişkenini tanımlıyoruz, aynı anda ikinci bir değişken daha tanımlayamaz mıyız?

Tanımlayabiliriz :)

Aşağıdaki kod örneğinden de görebileceğiniz gibi, aynı anda iki değişken tanımlayıp, biri ile döngüyü ilerletmek, diğeri ile dizideki eleman adedini bir defa hesaplatmak mümkün;

Performans karşılaştırması için aşağıdaki küçük uygulamayı geliştirdim;

Sonuçlar, bilgisayarın konfigürasyonuna, o an çalışmakta olan uygulamalara, debug-release mode’lara, x86-x64 mimariler arasındaki farklara, .Net versiyonuna, vs göre o kadar fazla farklılık gösterebilir ki, performans konusuna çok vakit ayırmak istemedim.

Eğer yorumunuz veya sorunuz varsa, lütfen aşağıya yazınız. Sizin sistemlerinizde üretilecek sonuçları da merak ediyorum.

Benim kullanmakta olduğum notebook’ta sonuçlar aşağıdaki gibi;

CPU: i7 7700HQ x64
OS: Windows 10 (16241) 64bit
RAM: 32GB 2666MHz

for ve foreach döngüleri performans karşılaştırması

Benim ortamımda foreach döngüsü, for döngüsünden daha performanslı çıktı. 80.000 elemanlı bir dizide aradaki fark birkaç nanosaniye civarında olsa da, 800.000.000 elemanlı bir dizide fark yaklaşık 700ms civarına çıkıyor.

Çok elemanlı olmasa da sürekli üzerinde döndüğümüz diziler varsa, her seferinde kazanacağımız nanosaniyeler-milisaniyeler, toplamda büyük rakamlara ulaşabilir ;)

Fazla Mesai Etkinliği Haziran 2017

19 Haziran 2017 akşamı Microsoft Türkiye ofisinde sevgili Microsoft RD arkadaşlarım Daron Yöndem, Hakan Uzuner ve Adam Cogan ile bir etkinlik organize ettik.

Fazla Mesai ismini verdiğimiz bu etkinlikte ben de Azure WebApps ve Azure Storage konularına değindim.

Fazla Mesai Etkinliği, Haziran 2017

Etkinliğe katılan herkese teşekkür ederim, umarım faydalı olmuştur.

HTML5 ve CSS3 kullanarak (Flexbox ile) Card yapalım

Bu makalede aşağıdaki görselde de görebileceğiniz kartlardan yapacağız. Kartları sadece HTML5 ve CSS3 kullanarak kodlayacağız.

Böylece #3 numaralı istek makale kapanmış olacak :)

Not : Issues sayfasında varolan makale isteklerini görebileceğinizi, hatta yeni makale isteğinde bulunabileceğinizi biliyor muydunuz?

Öncelikle projeyi kendi bilgisayarımızda oluşturabilmek için nodejs.org adresinden en güncel NodeJs kurulumunu indirelim ve bilgisayarımıza kuralım.

Kurulum bittikten sonra hemen projemiz için yeni bir dizin oluşturalım, Command Prompt penceresi açalım ve aşağıdaki komutu çalıştıralım;

Eğer bilgisayarınıza daha önce http-server npm paketini kurmadıysanız öncelikle aşağıdaki komutu çalıştırarak http-server paketini kurmanız gerekiyor;

Proje için oluşturduğumuz dizinde bir index.html bir de index.css dosyası oluşturalım, index.html dosyası içerisine aşağıdaki html kodlarını yazalım;

Card nesnemizin parçaları;

Şimdi index.css dosyasını açarak stil vermeye başlayabiliriz.

İlk olarak body elementinin font‘unu Segoe UI yapalım ve http://localhost:8080/ adresini açalım ve aşağıdaki gibi bir sayfa gördüğümüzden emin olalım;

Şimdi index.css dosyasına aşağıdaki kodu ekleyelim;

Eklediğimiz .card css class‘ı sayesinde bütün card nesnesini genişliği 150px olan bir çerçeve içerisine almış olduk;

Sırada başlığı düzeltmek var, index.css dosyasını açalım ve aşağıdaki kodu ekleyelim;

Böylece artık sayfamız aşağıdaki şekilde gözükmeye başlamalı;

Sırada, card nesnesinin asıl parçası var, hemen index.css dosyasını açalım ve aşağıdaki kodları ekleyelim;

Böylece artık sayfamız aşağıdaki şekilde gözükmeye başlamalı;

Son olarak, icon ve açıklama alanının stilini de ekleyelim;

Böylece artık sayfamız aşağıdaki şekilde gözükmeye başlamalı;

Bütün index.css dosyası aşağıdaki gibi olmalı;

Tüm Material Icon listesini Material Icons sayfasında bulabilirsiniz. Değişik renkler ve değişik icon‘lar ile sizler de istediğiniz gibi bir card tasarımı yapabilirsiniz.

Not : Bu makalenin orjinalini Build a Minimalist HTML Card in just 53 lines of code (with Flexbox) adresinden okuyabilirsiniz

DevNot Developer Summit Ankara Mayıs 2017 Etkinliği

06 Mayıs 2017 tarihinde DevNot Developer Summit Ankara 2017 etkinliği gerçekleştirildi.

Ben de Yük Altında Çalışan Web Uygulamaları Geliştirme konulu oturumda konuşmacı olarak yer aldım.

DevNot Summit Ankara, Mayıs 2017

Etkinlikte gerçekleştirdim konuşmayı aşağıdaki videodan izleyebilirsiniz;

Etkinlikte kullandığım sunumu da aşağıda bulabilirsiniz;

Etkinliği gerçekleştirmemizi sağlayan sevgili arkadaşım Uğur Umutluoğlu‘na ve etkinliğe katılan tüm arkadaşlara teşekkür ederim.

C# if-else switch-case ifadeleri kullanmadan method çağırma

Geçtiğimiz yıl, geliştirilmesine yardımcı olduğum bir e-ticaret sitesi projesinde bir gün aşağıdaki gibi kodlar yazıyordum;

Eminim benim gibi sizler de zaman zaman if-else blocklarını veya switch-case blocklarını yukarıdaki gibi kullanıyorsunuzdur.

Yukarıdaki kodda yanlış bir durum gözükmese de, ya biri birgün yeni bir arama methodu ekleyecek olsa? Hatta biri bir arama methodunu silmek istese?

İşte bu tip durumlarla karşılaşılabilir, bu durumu nasıl ortadan kaldırabilirim diye düşünerek, küçük egzersizler yapmaya başladım.

Sonunda aklıma şöyle bir fikir geldi;

  • Dictionary<TKey, TValue> sınıfından bir değişken tanımlasam ve Key için SearchArea, Value için Action tiplerini belirlesem
  • Bu değişkene istediğim SearchArea için istediğim Action'ları eklesem
  • Bir arama yapılacağı zaman SearchArea'a uygun Action'ları getirsem ve sırasıyla onları çağırsam?

Böylece istediğim SearchArea için bir veya daha fazla Action tanımlayabilir, onları çağırabilirim.

Nasıl fikir ama? :) (O zaman farkına varmasam da Delegate Dictionary isminde bir pattern zaten varmış)

Yukarıdaki adımların koda dökülmüş hali;

Sizce de daha güzel gözükmüyor mu? :)

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 459

Creative Commons Lisansı