Örnek sorular
Csharp Stdlib HttpZorluk 1
var names = new List<string>();
names.Add("ada");
names.Add("grace");
names.Add("ada");
Console.WriteLine(names.Count);
Bu ne yazdırır?
- a2, çünkü List<T>, Add çağrıldığında yinelenen değerleri sessizce kaldırır.
- b3, çünkü List<T> yinelenen elemanlara izin verir ve Count sadece kaç eleman eklendiğini yansıtır.✓
- cException fırlatır, çünkü Add zaten listede var olan bir değeri ekleyemez, tıpkı HashSet<T>.Add'in benzersizliği zorunlu kılması gibi.
- d0, çünkü Count yalnızca liste açıkça sıralandıktan sonra güncellenir.
Açıklama:List<T>, sıralı ve index tabanlı bir koleksiyondur ve yinelenen değerlere izin verir — Add çağrısında herhangi bir benzersizlik kontrolü yapmaz. Üç Add çağrısının her biri, eşit bir değer zaten var olsa da yeni bir eleman ekler, bu yüzden Count toplam Add çağrısı sayısını yansıtır: 3. Benzersizlik zorunluluğu List<T>'nin değil HashSet<T>'nin davranışıdır.
Csharp Stdlib HttpZorluk 2
var ages = new Dictionary<string, int>();
ages["ada"] = 30;
Console.WriteLine(ages["grace"]);
Bu çalıştığında ne olur?
- a0 yazdırır, çünkü Dictionary<K,V>'nin indexer'ı şu anda mevcut olmayan her anahtar için her zaman V'nin varsayılan değerini döndürür.
- bBoş bir string yazdırır, çünkü indexer, olmayan anahtarlar için boş bir sonuca düşer.
- cÇalışma zamanında KeyNotFoundException fırlatır, çünkü indexer'ın çalışması için anahtarın zaten sözlükte bulunması gerekir.✓
- d"grace"'i otomatik olarak 0 değeriyle ekler ve sonra 0 yazdırır.
Açıklama:Dictionary<K,V> indexer'ının getter'ı (ages["grace"]) istenen anahtar yoksa KeyNotFoundException fırlatır — varsayılan bir değer döndürmez ya da sessizce bir entry oluşturmaz. Olası eksik bir anahtarı exception almadan okumak için önce TryGetValue veya ContainsKey kullanılmalıdır; indexer sadece anahtarın varlığı zaten garantiyken okunmak için güvenlidir. Not: indexer'ın setter'ı (ages["ada"] = 30) ekle-ya-da-güncelle yapar, ama getter'da böyle bir fallback yoktur.
Csharp Stdlib HttpZorluk 1
var tags = new HashSet<string>();
bool first = tags.Add("go");
bool second = tags.Add("go");
Console.WriteLine($"{first} {second} {tags.Count}");
Bu ne yazdırır?
- aTrue False 1, çünkü HashSet<T>.Add, eşit bir eleman zaten varsa false döner ve ekleme yapmaz.✓
- bTrue True 2, çünkü HashSet<T>, List<T> gibi aynı değerin iki kez eklenmesine izin verir.
- cİkinci Add çağrısında exception fırlatır, çünkü HashSet<T> zaten var olan bir değerin yeniden eklenmesini yasaklar.
- dFalse False 0, çünkü Add, bir set boşken ilk çağrıda her zaman false döner.
Açıklama:HashSet<T> benzersizliği zorunlu kılar: Add, eleman zaten yoksa true döner ve ekler; eşit bir eleman zaten varsa set'i değiştirmeden false döner. Burada ilk Add("go") başarılı olur (true, count 1 olur), ikinci Add("go") ise "go"nun set'te zaten olduğunu bulur, bu yüzden hata fırlatmadan ve Count'u artırmadan false döner.
Csharp Stdlib HttpZorluk 2
var scores = new List<int> { 10, 20, 30 };
Console.WriteLine(scores[3]);
Bu çalıştığında ne olur?
- a0 yazdırır, çünkü List<T>, verilen index aralık dışı olduğunda eleman tipinin varsayılan değerini sessizce döndürür.
- b30 yazdırır, çünkü indexer istenen index'i son geçerli konuma sabitler (clamp).
- cListeyi sessizce yeni bir varsayılan elemanla büyütür ve bu yeni elemanın değerini yazdırır.
- dArgumentOutOfRangeException fırlatır, çünkü 3 numaralı index, 3 elemanlı bir liste için geçerli 0..2 aralığının dışındadır.✓
Açıklama:scores, 0, 1 ve 2 index'lerinde üç elemana sahiptir. List<T>'nin indexer'ı sınır kontrolü yapar ve istenen index negatifse ya da Count'a eşit ya da büyükse ArgumentOutOfRangeException fırlatır — asla sabitleme yapmaz, varsayılan değer döndürmez ya da okuma sırasında listeyi otomatik büyütmez. Bir listeyi büyütmek için Add/Insert'i açıkça çağırmak gerekir.
Csharp Stdlib HttpZorluk 2
Belirli bir sırayla birkaç anahtar ekledikten hemen sonra bir Dictionary<string, int>'i foreach ile geziyorsunuz. Iterasyon sırası hakkında hangi ifade doğrudur?
- aDictionary<K,V>, tıpkı List<T> gibi, anahtarları her zaman eklendikleri sırayla gezer.
- bDictionary<K,V>, belirli bir iterasyon sırasını garanti etmez ve kod, ekleme sırasına ya da başka özel bir sıraya güvenmemelidir.✓
- cDictionary<K,V>, anahtarları her zaman string temsillerine göre alfabetik sıralı gezer.
- dDictionary<K,V>, tamamen aynı değişmemiş instance ve process içinde bile her tek enumeration'da değişen rastgele bir sırayla gezer.
Açıklama:Dictionary<K,V>, hash tabanlı bir koleksiyondur: enumeration sırası, .NET sürümleri arasında, resize'lardan sonra ya da silmelerden sonra değişebilen dahili bucket düzenine bağlıdır. Pratikte, hiç silme yapılmamış küçük sözlüklerde genellikle ekleme sırasına yakın görünür, ama bu belgelenmiş bir garanti değildir, bu yüzden kod buna asla güvenmemelidir — belirli bir sıra gerekiyorsa SortedDictionary<K,V> kullanılmalı ya da LINQ'un OrderBy'ı ile açıkça sıralanmalıdır.
Csharp Stdlib HttpZorluk 3
var numbers = new List<int> { 1, 2, 3 };
var query = numbers.Where(n => n > 1);
numbers.Add(4);
foreach (var n in query)
Console.Write(n + " ");
Bu ne yazdırır?
- a2 3 4 , çünkü Where, kaynak listeyi ancak iterate edildiği anda okuyan gecikmeli bir sekans döndürür — Add(4) o ana kadar zaten gerçekleşmiştir.✓
- b2 3 , çünkü Where çağrıldığı anda listenin içeriğinin bir anlık görüntüsünü (snapshot) yakalar, Add(4) gerçekleşmeden önce.
- cInvalidOperationException fırlatır, çünkü liste, üzerinde Where çağrıldıktan sonra değiştirilmiştir.
- d1 2 3 4 , çünkü Where yalnızca query ilk kez iterate edildiğinde filtreleme yapar, sonrasında predicate'i yok sayar.
Açıklama:LINQ'un Where'i hemen çalışmaz — query mantığını ve kaynak referansını yakalayan bir IEnumerable<T> döndürür, ama kaynağı ancak bir şey onu gerçekten iterate ettiğinde (burada foreach) gezer. Add(4), foreach eleman çekmeye başlamadan önce gerçekleştiği için, query enumeration anındaki liste durumunu görür — yeni eklenen 4 dahil — ve bunu n > 1 ile filtreler: 2, 3, 4. Bu, deferred execution tuzağıdır — query'nin okuduğu aynı List<T>'yi değiştirmek burada hata fırlatmaz çünkü değişiklik iterasyon SIRASINDA değil, iterasyon başlamadan ÖNCE olur.