Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
LINQ Partitioning: Take, Skip, TakeWhile, Chunk ve Take(Range)
TakeWhile neden bir filtre değildir, Skip ve Take ile doğru sayfalama ve sıralamanın sessiz kuralı, TakeLast/SkipLast'ın sona kadar okuması, .NET 6 ile gelen Take(Range) ve array slice farkı, Chunk ile paketlere bölmek ve partitioning operatörlerinin kaynaktan tam olarak ne kadar okuduğu.
LINQ Element Operatörleri: First, Last, Single, ElementAt ve OrDefault
First, Last, Single ve ElementAt ailesi ile OrDefault kardeşleri; value type'larda 0'ın 'bulunamadı' ile karışması, .NET 6'nın varsayılan değer parametresi ve Index overload'ları, First ile Single arasındaki niyet farkı ve nullable uyarıları.
LINQ ile Projection: Select, SelectMany ve Anonymous Type
Select ile bire bir, SelectMany ile bire çok projection; DTO'ya dönüştürmek, result selector ile üst bilgiyi korumak, kartezyen çarpım, anonymous type'ın eşitlik ve with kuralları, method dışına tuple mı record mı.
LINQ ile Filtreleme ve Sıralama: Where, OrderBy, ThenBy ve Reverse
Where ve index overload'u, ikinci OrderBy'ın ilkini neden sildiği, ThenBy ile çok key'li sıralama, OrderBy'ın stable, List.Sort'un unstable oluşu, kültüre bağlı string sıralaması ve Reverse ile OrderByDescending farkı.
LINQ Deferred Execution: Sorgu Ne Zaman Çalışır? IEnumerable ve IQueryable
LINQ sorgusunun tanımlandığında değil dolaşıldığında çalışması, element element streaming, hemen çalışan ve non-streaming operatörler, çoklu enumeration'ın bedeli ve Func ile expression tree üzerinden IEnumerable ile IQueryable farkı.
LINQ Nedir? C# ile Query Syntax ve Method Syntax
LINQ'in döngülerle yazdığımız sorgulara getirdiği değişiklik, onu mümkün kılan C# 3.0 özellikleri, query syntax'ın derleyicide method çağrısına nasıl çevrildiği, hangi yazımı ne zaman seçmek gerektiği ve ilk tuzaklar.
C# 13–14 ve .NET 9–10: OrderedDictionary, params Collections ve Fazlası
Dictionary'nin sıra sözü vermemesi ve .NET 9'un generic OrderedDictionary'si, .NET 10'un index döndüren TryAdd/TryGetValue'su, PriorityQueue.Remove, string ayırmadan alternate lookup, C# 13 params collections ve C# 14 extension members ile span dönüşümleri.
C# 11–12 ve .NET 7–8: Generic Math, Frozen ve Collection Expressions
C# 10'da yazılamayan generic toplama, static abstract member'lar ve INumber<T> ile generic math; bir kez kurulup çok okunan FrozenDictionary ve FrozenSet'in BenchmarkDotNet ölçümü; köşeli parantezli collection expression'lar, spread ve CollectionBuilder.
C# Generic Variance: Covariance ve Contravariance (in ve out)
List<EBook> neden List<Book> olamaz ama IEnumerable<Book> olabilir? Array covariance'ın deliği, out ile covariance, in ile contravariance, delegate'lerde variance, kuralların sınırları ve CS0266'nın önerdiği cast tuzağı.
C# Immutable Collection'lar ve Doğru Collection'ı Seçmek
Read-only view ile gerçek immutability farkı, ImmutableList'in structural sharing'i, builder'lar, ImmutableArray ile ImmutableList'in BenchmarkDotNet ile ölçülen farkı ve karmaşıklık haritasıyla doğru collection'ı seçmek.
C# Collection Interface'leri: IEnumerable, ICollection, IList ve yield return
IEnumerable, ICollection, IList ve IReadOnly* interface'leri neyi vaat eder, neyi etmez; array'in Add'de neden patladığı, iç listeyi güvenle dışarı açmak, parametre tipi seçmek ve yield return ile lazy iterator'ler yazmak.
C# Sıralı Collection'lar: SortedList, SortedDictionary, SortedSet ve IComparer
Comparer sıfır döndürünce SortedSet'ten sessizce kaybolan kitap ve eşitlik bozucu ikinci kriter. Red-black tree üzerindeki SortedDictionary, iki sıralı array'li SortedList ve hangisinin ne zaman seçileceği; SortedSet ile Min, Max ve canlı GetViewBetween; IComparer, kültüre duyarlı string sırası ve bozuk comparer tuzakları.