Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
C# Async Programlama Neden Var: Bloklamak, I/O ve Ölçek
Aynı 100 stok sorgusu async ile bir saniyede, thread'i bekleten kodla 8-9 saniyede bitiyor. I/O-bound ve CPU-bound iş farkı, bloklamanın UI'da ve sunucuda bedeli, thread pool starvation, async'in hız değil kapasite kazandırması ve sahte async tuzağı.
LINQ ve .NET 10: LeftJoin, RightJoin, Shuffle, Sequence ve Async LINQ
.NET 10'da LINQ: GroupJoin ve DefaultIfEmpty pattern'ının yerini alan LeftJoin ve RightJoin, deferred çalışan Shuffle, generic math üzerine kurulu Sequence ve InfiniteSequence, BCL'e giren System.Linq.AsyncEnumerable ve System.Linq.Async paketiyle yaşanan CS0121 çakışması; .NET 11'de gelecek FullJoin'e kısa bakış.
LINQ ve .NET 9: CountBy, AggregateBy ve Index
.NET 9'da LINQ: dictionary değil sequence döndüren CountBy, key bazında biriktiren AggregateBy ve GroupBy'a göre bellek farkının BenchmarkDotNet ölçümü, Select((x, i) => ...) yerine Index(), Queryable karşılıkları ve mutable seed tuzağı.
LINQ ve .NET 7–8: Order, Selector'süz ToDictionary ve Performans
.NET 7'nin key selector istemeyen Order ve OrderDescending operatörleri, IComparable eksikliğinin ancak runtime'da patlaması, kültüre duyarlı ve ordinal string sıralama, .NET 8'in selector'süz ToDictionary'si ve BenchmarkDotNet ile ölçülen vectorize edilmiş Max/Sum ile Order ve OrderBy(x => x) farkı.
Gerçek Veriyle LINQ: JSON Dosyasından Okunan Siparişlerle Senaryolar
System.Text.Json ile dosyadan okunan siparişler üzerinde LINQ: büyük-küçük harf tuzağı ve JsonSerializerDefaults.Web, veriyi doğrulamak (tekrar eden, müşterisi olmayan, hatalı adetli kayıtlar), aylık ciro, en çok satanlar, GroupJoin ile müşteri raporu, JSON'a geri yazmak ve DeserializeAsyncEnumerable ile stream ederek okumak.
LINQ Performansı: Çoklu Enumeration, Materialize ve BenchmarkDotNet ile Ölçmek
Aynı sorgunun farkında olmadan kaç kez çalıştığı, ToList'in ne zaman kurtarıp ne zaman zarar verdiği, Count() > 0 yerine Any() ve TryGetNonEnumeratedCount; BenchmarkDotNet 0.15.8 ile döngü içindeki Where'in lookup'a göre 50 kat yavaşlığını ve gürültülü bir makinede döngü ile LINQ karşılaştırmasını gerçek sayılarla ölçmek.
LINQ'te Kendi Operatörünü Yazmak: Extension Method ve yield return
LINQ operatörünün aslında bir extension method olduğu; yield return ile lazy ve streaming operatör yazmak, argüman doğrulamasını iterator'den ayırmak, immediate operatörler, erken bırakılan enumeration'da finally, IQueryable için Expression alan operatör ve BCL ile isim çakışması.
LINQ Any, All, Contains, SequenceEqual ve Dönüşüm Operatörleri
All'ın boş sequence'te neden true döndüğü ve doğrulamada Any ile birlikte kullanmak, Any'nin ilk element'te durması ve Count() > 0 farkı, Contains ve record eşitliği, SequenceEqual ve collection taşıyan record tuzağı, ToList/ToArray/ToHashSet ile snapshot, ToDictionary'de tekrar eden key ve Cast ile OfType farkı.
LINQ Join ve GroupJoin: Inner Join, Composite Key ve Left Join Pattern'ı
Join'in inner join olarak eşleşmeyeni düşürüp çoklu eşleşmeyi çoğaltması ve dokümante edilen sırası. Query syntax'ta equals'ın yönü ve CS1937/CS1938, composite key ve CS1941, GroupJoin ile hiyerarşik sonuç, GroupJoin + DefaultIfEmpty ile left join pattern'ı ve null tuzağı, çoklu join ve Join'in lookup ile n + m'de çalışması.
LINQ Set İşlemleri: Distinct, Union, Intersect, Except ve DistinctBy
Distinct'in eşitliği nereden aldığı ve eşitliği olmayan class'ta neden hiçbir şey silmediği. Union, Intersect ve Except'in sonucu tekilleştirmesi, Concat ve Where ile farkları, dokümante edilen sıra, comparer ile karşılaştırma, .NET 6 DistinctBy/UnionBy ve key listesi alan IntersectBy/ExceptBy, CS0411 hatası, HashSet ve deferred execution.
LINQ Gruplama: GroupBy, IGrouping ve ToLookup
GroupBy'ın deferred, ToLookup'ın immediate çalışması ve bunun sonuca etkisi. IGrouping'in key ve element'leri, dokümante edilmiş grup sırası, gruplayıp özetlemek, element ve result selector overload'ları, query syntax'ta group by into, composite key'ler, ToLookup'ın olmayan key davranışı, comparer ile gruplama ve GroupBy'ın kaynağı buffer'laması.
LINQ Aggregation Operatörleri: Count, Sum, Average, Min, Max, Aggregate ve MinBy/MaxBy
Boş sequence'te Sum neden 0, Max neden exception döner ve nullable selector ile DefaultIfEmpty çözümleri. Count ile .NET 6 TryGetNonEnumeratedCount, Average'ın dönüş tipi, Sum'ın checked overflow'u, değer yerine element döndüren MinBy/MaxBy, Aggregate'in üç overload'u ve aynı sorguyu kaç kez enumerate ettiğin.