13 Ocak 2023 Cuma

Projection( Select, SelectMany )

  • Projection, bir nesnenin yeni form bir nesneye dönüşümünü tanımlar.
  • Projection, kullanarak orijinal türünüzden inşa edilmiş yeni bir tür oluşturabilirsiniz.

Select ile bir öğeden diğerine bir projeksiyon oluşturuyoruz. Basitçe söylemek gerekirse, belirli bir tipimizden istenen bir tipe map ediyoruz. Result set , Resource set aynı sayıda öğeye sahiptir.










SelectMany listenin içerisinde başka bir  liste olduğu senaryolarda içerideki listelerin tüm elemanlarını sırayla alt alta yazdırır. Burada flattne keywordu kullanılır. Aşağıdaki örnekte users listesi içindeki roles listesini incelersek roles listesi altındaki tüm kayıtlar tek tek alt alta yazdırılacak. 
"SuperAdmin"
"Guest"
"Reception"
"Nurse"
"Guest













Filtering ( Where, Take, Skip, Distinct, DistinctBy, OfType )

Where metodu bir predicate kabul eder. Bu predicaye uyan sonuçlar yeni bir enumeration olarak return edilir.




Take, isternen miktarda  öğeyi "almamızı" sağlar. Eğer dizide almak istediğimizden daha az eleman varsa  Take() yalnızca kalan nesneleri döndürür.





Skip ile verilen miktarda öğeyi "atlarız". Listemizin tuttuğundan daha fazla öğeyi atlarsak, emty bir enumeration elde ederiz. Pagenitaion gibi işlerde Take ve Skip birlikte kullanıldığında çok başarılı olur.






Distinct, tüm dublicelerin kaldırıldığı, Set gibi yeni bir enumeration döndürür.

DistinctBy, Distinct'e benzer şekilde çalışır, ancak person nesnelerinin age propertysine göre distinct yapmak istediğimizde kullanabiliriz. Yaşı 31 olan nesnelerin dublice olanları yeni oluşturualcak enumerationa eklenmeyecek.



OfType, numaralandırmadaki her öğenin belirli bir tür olup olmadığını kontrol eder.
    

Sadece Apple ve Appledan miras alan alt sınıflar olursa yeni oluşturulacak enumerationa onları ekler.


LINQ Nedir ?


LINQ; açılımı Dil Tümleşik Sorgu (Dile Entegre Edilmiş Sorgu) olan, Microsoft tarafından kullanılan ve C# 3.0 ile hayatımıza giren farklı veri kaynaklarından sorgulamamıza imkan verir.

LINQ, koleksiyonlar, ADO.Net DataSet, XML, SQL Server, Entity Framework ve diğer veritabanları gibi farklı veri kaynağı türlerinden veri almak için oluşturulmuş bir sorgu söz dizisidir. Alttaki görsel durumunu daha net anlatacaktır.



  • Tüm LINQ sorgularının üzerinde çalıştığı temel tür IEnumerable'dır.
  • Tüm LINQ sorguları  result olarak her zaman new object döndürür. Böylece orjinal enumeration mutable olarak kalacaktır. Yani üzerinde işlem yapılan yapı değişmemiş olacak.

IENUMERABLE

IEnumerable lazy evaluationdur. Yani ToList(), Count gibi operasyonları uygulamadan gerçek sonucu elde edemeyiz.(Materialization Conversion)

 Yukarıdaki kodu incelersek eğer. evenNumbersın değereri en alttaki evenNumbers.Count() operayon çağrılana kadar oluşturulmayacağı için listeye eklenen 4 değeride hesaba katılmış olacaktır.






LINQ'in gerçek gücü, birden çok operasyonu birleştirdiğinizde ortaya çıkacaktır.






12 Ocak 2023 Perşembe

List Of Collection


IEnumerable
  • Bir kolleksiyondan elemanları teker teker almak için bir metod tanımlayan bir interfacedir.
  • Genellikle bir dizi elemanı döndüren metodların return typesi olarak kullanılır.
  • Bu interface , bir koleksiyonun foreach döngüsünde(loop)  kullanılmasına izin verir.
  • Aynı zamanda neredeyse tüm LINQ işlemleri (Count(),Where(), Select() vs.) için base typedır.
  • IEnumerable'ın doğası, Usera bir  objeyi enumerate  edebileceğini söylemektir. Bunu enumerationun sonuna gelene kadar bir sonraki elemena tek tek geçerek yapar. 
  • IEnumerable lazydir.
Lazy gerçekten ihtiyaç duyulana kadar bir değerin hesaplanmasını geciktirmek için kullanılan bir tekniktir .IEnumerable bağlamında, dizinin öğelerinin, diziyi kullanan kod tarafından gerçekten erişilene kadar hesaplanmadığı anlamına gelir.

int.MaxValue'ye kadar kapsamlı bir asal sayılar listesi oluşturduğumuz küçük bir örnek. Ancak kullanıcı tüm sayılar yerine sadece 100 istiyorsa 100. asal sayıdan sonra devam etmiyoruz.


IQueryable
IQuerable, IEnumrableyi extend eder ve genellikle memoryde tutulmayan nesneler veya koleksiyonlarla kullanılır. En göze çarpan örnek, DbContext'in (veya daha iyisi DbSet'in) size temel depolama sağlayıcısından verilerinizi toplamak için bir IQueryable nesnesi sunduğu Entity Framework'tür. Aynı şey Linq to XML için de geçerlidir.

Koleksiyonlar için IEnumerable, verileri sorgulamak için IQueryable kullanılır. Ama ikisinin de ortak bir davranışı var:aynı zamanda lazy olarak değerlendirilir. Her iki tür de hemen çalıştırılmaz. Bunları örneğin ToList() aracılığıyla gerçekleştirmek gerekir.

Ne zaman kullanılır?
Memory dışında olan bir dizi veri kaynağıyla çalışmak istiyorsanız, IQueryable interfacesini kullanmak istersiniz. Aksine, veri kaynağınız memorydeyse(RAM) IEnumerable'ı kullanırsınız.
IQurable ve IEnumerable farkı için buraya tıklayabilisin.

ICollection
IEnumerable ve IQueryable lazy olarak değerlendirildi fakat  ICollection lazy değildir.
ICollection, enumerationa birkaç işlevsellik ekler: Add, Remove ve Clear gibi. Artık sahip olduğumuz koleksiyonu mutasyona uğratabileceğimizdir. IEnumerable ve IQuerable interfacelerinde  bu mümkün değildi. ICollection, IEnumerable'dan da miras alır. Böylece birbirlerinin üzerine inşa edildiklerini görebilirsiniz. Dolayısıyla, ne zaman bir ICollection türüne sahipseniz, onu IEnumerable için de kullanabilirsiniz. Bu nedenle LINQ temelde tüm koleksiyonlarda çalışır çünkü neredeyse tamamı IEnumerable'dan miras alır.

Ne zaman kullanılır?
Halihazırda gerçekleştirilmiş bir nesneye ihtiyacınız olduğunda (örneğin bir LINQ sorgusunun sonucu olarak) veya koleksiyonun kendisini değiştirmek istediğinizde ICollection'ı kullanın. Yani belirli girişleri Add veya Remove yapmak istediğimizde.

IList
IList, ICollection'dan devralır, yani ICollection ile yapabileceğiniz her şeyi IList ile de yapabilirsiniz. Peki o zaman fark nedir? IList'in bir indexera sahip olmasıdır. Dolayısıyla, enumerationda  sabit düzene sahibiz.
Ne zaman kullanılır?
Yani buradaki kullanım durumu açık. Bir öğeyi indeks yoluyla elde etmek, öğe çıkarmak veya eklemek istiyorsanız, IList sizin adayınız olabilir.

IReadOnlyCollection ve IReadOnlyList
Adından da anlaşılacağı gibi, yalnızca öğeleri okuyabilirsiniz ancak koleksiyona bir şey eklemenize, kaldırmanıza veya koleksiyondan bir şey silmenize izin verilmez.

Ne zaman kullanılır?
Koleksiyonun durumunu değiştirmek istemediğiniz (Ekle, Kaldır, Temizle) durumlarda kullanabiliriz.  İndeksleyiciye ihtiyacınız varsa, IReadOnlyCollection yerine IReadOnlyList'i kullanın

ISet
Uniq öğelerin bir koleksiyonudur.
ISet türünde bir nesneniz varsa, içinde dubicate  olmadığını bilirsiniz.
Add,Remove gibi metodları vardır ve indexera sahip değildir.

Ne zaman kullanılır?
Bir öğe koleksiyonunu depolamak ve dublice olmadığından emin olmak istediğinizde kodunuzda ISet'i kullanabilirsiniz. 

HashSet
HashSet yalnızca uniq öğelere sahip olduğundan, dahili yapısı daha hızlı aramalar için optimize edilmiştir. Geçerli bir sözdizimi olmasına rağmen, bir HashSet üzerinden foreach kullanmak da mantıklı değil. Bir küme, herhangi bir düzene sahip olmamakla tanımlanır, foreach kullanmak bir dereceye kadar düzen empoze eder

Stack
Last in First out şeklinde çalışır. 


Queue
First in First out şeklinde çalışır.



TASK

 Task Nedir ?

Bir pizza yaptığımızı düşünelim. Tüm malzemeleriniz hazır, ancak pişirmeden önce hamurun bir süre kabarmasına izin vermeliyiz. Hamurun kabarmasını beklerken sofrayı kurmak ya da televizyon izlemek gibi başka şeyler yapabiliriz.

Daha teknik olarak: C#'ta bir Task, asynchronous operationu temsil eder. Senkronize koda benzer bir şekilde asenkron kod yazmanıza izin vererek okumayı ve bakımını kolaylaştırır.

Taskların multi threadlerle ilişkisi yoktur. Tasklar kendini call eden  kodla aynı thread tarafındanda execute edilebilir yada ayrı bir thread tarafından da execute edilebilir. Thread seçimi , Taskların execute edilmesini yönetmekten sorumlu olan task scheduler tarafından belirlenir.

WebAssembly kullanan Blazor Client veya Promisleri içeren  (Tasklara çok benzer) javascript gibi teknolojileri düşünün. Bu iki teknoloji yalnızca tek bir thread üzerinde çalışır. Yinede Taskları ve asenlron programlamayı kullanabilir.

Taskları Neden Kullanırız?

Taskların kullanılmasındaki ana sebep ölçeklendirmedir. Kesinlikle performans değildir.

Sonuç olarak, Tasklar C#'ta basit, Senkron benzeri bir sözdizimiyle eşzamansız(asenkron) kod yazmamıza  izin veren önemli bir kavramdır. Tasklar ayrı threadler tarafından  execute edilebilir ve performanstan çok ölçeklenebilirlik için kullanılırlar.

Async Await

 


Yukarıdaki async ve sync olan kodlar Hemen hemen aynı görünüyorlar, Hatta async olan daha complex görünsede yinede async olanı tercih etmeliyiz. Fakat tercih sebebimiz performans değildir.

Tercih sebebimiz async olanın daha iyi ölçeklenebilir olmasıdır. İlk olarak sync olan versiyonu inceleyelim. repository.GetById(...)'ye tetiklediğimizde , geçerli thread durur ve task bitene kadar beklemek zorundadır. Büyük olasılıkla asıl işi yapan bir DocumentDb veya SQL Server'ınız var. Ve bunlar local de değil, farklı bir makinedeler, yani sunucunuz cevap dönene kadar thread tam anlamıyla boşta kalıyor ve bekliyor.

Şimdi async versiyonuna bir göz atalım: Burada da repositoryinin işini bitirmesini beklememiz gerekiyor ama önemli bir fark var. Await keywordu, current worker threadin programdan "ayırılmasına(detach)" ve thread poola geri dönmesine olanak tanır. GetByIdAsync tamamlandığında , .NET pooldan başka bir thread alır ve çalışmaya devam eder. Threadin async işler tamamlana kadar thread poola gitmesi ve başka işler yapması programımızın ölçeklenebilirliğini arttırmaktadır.

Servera her request attığımızda, yeni bir worker threadin  öğelerinizi işleyeceğini görürsünüz. Thread async işlemi beklemek yerine thread poola geri döndüğünde , bu threadi  başka bir requesti işlemek  için kullanabiliriz. 

ASP.NET Core'da async programlama, web uygulamanızı ölçeklendirmenin süper verimli bir yoludur. Sunucunuzu tam olarak kullanabilirsiniz ve sistem kaynakları boşta durmak zorunda kalmaz