- Bit
- Byte
- İkilik sayıyı(binary) ondalık sayıya(decimal) çevirme
- Ondalık sayıyı(decimal) ikilik sayıya(binary) çevirme
- Struct
- Class ve Struct Farkı
- Hashtable ve Dictionary
- Boxing / Unboxing
- Class
- HashTable
- SortedList
- List
- Stack
- Queue
- LinkedList
- Dictionary
- SortedDictionary
- SortedSet
Bit, dijital bilgisayar sistemlerinde en küçük veri birimidir ve "binary digit" (ikili rakam) teriminin kısaltmasıdır. Bit, yalnızca iki değerden birini alabilir: 0 veya 1. Bu iki durum...
Byte: Byte, dijital bilgisayar sistemlerinde veri depolama ve işleme için kullanılan temel birimdir. 1 byte, 8 bitten oluşur ve bu sayede 256 farklı değeri (0-255) temsil edebilir. Byte, karakterlerin, küçük veri miktarlarının ve çeşitli veri türlerinin saklanmasında yaygın olarak kullanılır.
SByte: sbyte
, "signed byte" teriminin kısaltmasıdır ve işaretli bir bayttır. Bu veri türü, 8 bitlik bir alana sahiptir ve pozitif veya negatif değerler alabilir. sbyte
, -128 ile 127 arasında değerler depolayabilir. Genellikle, sayısal verilerin işaretli (negatif veya pozitif) olarak saklanması gerektiğinde kullanılır.
İkili sayı: 1011
-
İkili sayıyı yaz ve basamakları belirle:
- Basamak değerleri, en sağdan sola doğru 2'nin kuvvetleri olarak artar.
- Sağdan sola: 2^0, 2^1, 2^2, 2^3.
1 0 1 1 2^3 2^2 2^1 2^0
-
Her bitin değerini hesapla:
- Sağdan en soldaki bit (1): 1 x 2^3 = 1 x 8 = 8
- İkinci bit (0): 0 x 2^2 = 0 x 4 = 0
- Üçüncü bit (1): 1 x 2^1 = 1 x 2 = 2
- Sağdan en sağdaki bit (1): 1 x 2^0 = 1 x 1 = 1
-
Tüm değerleri topla:
- Toplam = 8 + 0 + 2 + 1 = 11
İkili sayı 1011 ondalık olarak 11'e eşittir.
Bitler: 1 0 1 1
2^3 2^2 2^1 2^0
8 0 2 1
Toplam: 8 + 0 + 2 + 1 = 11
İkili sayı: 00001011
-
İkili sayıyı yaz ve basamakları belirle:
- Basamak değerleri, en sağdan sola doğru 2'nin kuvvetleri olarak artar.
- Sağdan sola: 2^0, 2^1, 2^2, 2^3, 2^4, 2^5, 2^6, 2^7.
0 0 0 0 1 0 1 1 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
-
Her bitin değerini hesapla:
- Sağdan en soldaki bit (0): 0 x 2^7 = 0
- İkinci bit (0): 0 x 2^6 = 0
- Üçüncü bit (0): 0 x 2^5 = 0
- Dördüncü bit (0): 0 x 2^4 = 0
- Beşinci bit (1): 1 x 2^3 = 8
- Altıncı bit (0): 0 x 2^2 = 0
- Yedinci bit (1): 1 x 2^1 = 2
- Sekizinci bit (1): 1 x 2^0 = 1
-
Tüm değerleri topla:
- Toplam = 0 + 0 + 0 + 0 + 8 + 0 + 2 + 1 = 11
8 bitlik ikili sayı 00001011 ondalık olarak 11'e eşittir.
Bitler: 0 0 0 0 1 0 1 1
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
0 0 0 0 8 0 2 1
Toplam: 0 + 0 + 0 + 0 + 8 + 0 + 2 + 1 = 11
- Ondalık sayıyı 2'ye böl ve kalanı yaz. (Bu kalan ya 0 ya da 1 olacaktır.)
- Bölüm sonucu tekrar 2'ye böl ve kalanı yaz.
- Bu işlemi, bölüm 0 olana kadar devam ettir.
- Kalanları tersten yaz (en son kalandan en ilk kalana doğru).
- 11'i 2'ye böl:
- Bölüm = 5, Kalan = 1
- 5'i 2'ye böl:
- Bölüm = 2, Kalan = 1
- 2'yi 2'ye böl:
- Bölüm = 1, Kalan = 0
- 1'i 2'ye böl:
- Bölüm = 0, Kalan = 1
- Kalanlar: 1, 0, 1, 1
Bu kalanları tersten yazarsak, 11 ondalık sayısının ikili karşılığı 1011 olur.
Adım 1: 11 ÷ 2 = 5, kalan 1
Adım 2: 5 ÷ 2 = 2, kalan 1
Adım 3: 2 ÷ 2 = 1, kalan 0
Adım 4: 1 ÷ 2 = 0, kalan 1
Kalanlar (tersten): 1011
11 ondalık sayısı, ikili olarak 1011'e eşittir.
struct
yapısı, C# dilinde değer türü oluşturmak için kullanılan bir veri tipidir. Bu yapı, farklı veri tiplerini bir araya getirerek bir değişkenin birden fazla veri türünü saklamasına izin verir. Yapılar parametreli constructor, statik constructor, sabitler, alanlar, metotlar, özellikler, indexerler, operatörler ve iç yapılar gibi öğeleri içerebilir.
Yapı Tanımlama ve Kullanım
Yapılar struct
anahtar sözcüğüyle tanımlanır. Yeni bir değişken oluşturmak için new
operatörü kullanılabileceği gibi, kullanılmadan da oluşturulabilir; bu durumda üy
eler varsayılan değerlerle başlatılır.
public struct Coordinate
{
public double X { get; }
public double Y { get; }
public Coordinate(double x, double y)
{
X = x;
Y = y;
}
public override string ToString() => $"({X}, {Y})";
}
public static class StructWithoutNew
{
public static void Main()
{
Coordinate p;
p.X = 3;
p.Y = 4;
Console.WriteLine(p.ToString()); // Çıktı: (3, 4)
}
}
- Referans türüdür.
- Heap bellekte tutulur.
- Bir nesnenin referansını (adresini) saklar.
- Değerleri
null
olabilir. - Genellikle daha büyük ve karmaşık veri yapılarını temsil etmek için kullanılır.
- Oluşturulan nesneler üzerinde yapılan değişiklikler, tüm referansların üzerinde etki gösterir.
- Değer türüdür.
- Stack bellekte tutulur.
- Değerin kendisini saklar.
- Değerleri
null
olamaz (varsayılan değerlerle başlatılır). - Genellikle küçük ve basit veri yapılarını temsil etmek için kullanılır.
- Oluşturulan nesneler kopyalandığında, her kopya bağımsız olarak değiştirilebilir.
Özellik | Class | Struct |
---|---|---|
Tür | Referans Türü | Değer Türü |
Bellek | Heap | Stack |
Null Olabilirlik | Evet | Hayır |
Kullanım | Karmaşık Veri Yapıları | Basit Veri Yapıları |
Kopyalama | Referans Kopyalama | Değer Kopyalama |
- Thread-Safety: Hashtable, thread-safe (iş parçacığı güvenli) değildir.
- Nullable Anahtarlar ve Değerler: Null olmayan anahtar ve değerleri kabul eder.
- Performans: Arama, ekleme ve silme işlemleri genellikle O(1) zaman karmaşıklığına sahiptir.
- Legacy Tip: Eski .NET versiyonlarından beri kullanılmaktadır.
- Thread-Safety: Varsayılan olarak thread-safe değildir.
- Nullable Anahtarlar ve Değerler: Null anahtarları ve değerleri kabul eder.
- Performans: Genellikle hashtable kadar hızlı olmasına rağmen, performans thread-safety mekanizmalarıyla değişebilir.
- Modern C# Standartı: C# dilinde modern ve yaygın kullanılan bir yapıdır.
Her iki yapı da anahtar ekleme (Add
), anahtar kontrolü (ContainsKey
), değer kontrolü (ContainsValue
), değer alma (this[key]
veya TryGetValue
), değer silme (Remove
) gibi ortak metotlara sahiptir.
Özellik | Hashtable | Dictionary |
---|---|---|
Thread-Safety | Hayır | Hayır |
Nullable Anahtar | Hayır | Evet |
Performans | O(1) | O(1) |
Kullanım Alanı | Eski .NET uygulamaları | Modern C# uygulamaları |
Boxing, değer türlerinin referans türlerine dönüştürülmesi işlemidir. Bu işlem sırasında, bir değer türü nesnesi, heap'te bir object veya interface türünde bir kutu (box) içine alınır. Boxing işlemi, performans açısından pahalıdır çünkü heap'te yeni bir nesne oluşturmayı gerektirir.
Örnek:
int num = 123;
object obj = num; // Boxing işlemi
Unboxing, referans türlerinin değer türlerine dönüştürülmesi işlemidir. Bu işlem sırasında, bir kutu (box) içindeki değer türü nesnesi, stack'te bir değere dönüştürülür. Unboxing işlemi, boxing işlemine kıyasla daha az maliyetlidir, ancak yine de dikkatli kullanılmalıdır.
Örnek:
object obj = 123;
int num = (int)obj; // Unboxing işlemi
İşlem | Açıklama | Performans |
---|---|---|
Boxing | Değer türünden referans türüne dönüştürme | Yüksek maliyetli |
Unboxing | Referans türünden değer türüne dönüştürme | Daha az maliyetli |
C# dilinde sınıf (class), nesne yönelimli programlamanın (OOP) temel yapı taşıdır. Sınıflar, nesnelerin özelliklerini (fields/properties) ve davranışlarını (methods) tanımlamak için kullanılır. Sınıflar, kodun yeniden kullanılabilirliğini, modülerliğini ve organizasyonunu sağlar.
C#'ta bir sınıf tanımlamak için class
anahtar kelimesi kullanılır. Sınıflar, genellikle namespace içinde tanımlanır ve erişim belirleyicileri (public, private, internal, protected) ile erişim seviyeleri belirlenir.
public class Person
{
// Fields (Alanlar)
private string name;
private int age;
// Properties (Özellikler)
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
age = value;
else
throw new ArgumentException("Age cannot be negative.");
}
}
// Constructor (Kurucu Metot)
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
// Methods (Metotlar)
public void DisplayInfo()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}
- Fields (Alanlar): Bir sınıfın verilerini saklayan değişkenlerdir. Genellikle private olarak tanımlanır.
- Properties (Özellikler): Alanlara erişimi sağlayan get ve set metotlarını içeren üyeler.
- Methods (Metotlar): Bir sınıfın davranışlarını tanımlayan fonksiyonlardır.
- Constructors (Kurucu Metotlar): Bir sınıfın yeni bir örneği oluşturulduğunda çalışan özel metotlardır.
- Destructors (Yıkıcı Metotlar): Bir sınıfın örneği bellekten kaldırıldığında çalışan metotlardır (nadir kullanılır).
- Bellek Yönetimi:
- Class: Heap bellekte tutulur ve referans türüdür.
- Struct: Stack bellekte tutulur ve değer türüdür.
- Kalıtım:
- Class: Kalıtım alabilir (inheritance) ve türetilmiş sınıflar oluşturabilir.
- Struct: Kalıtım alamaz, sadece interface'lerden kalıtım alabilir.
- Null Olabilme:
- Class: Null olabilir.
- Struct: Varsayılan olarak null olamaz, ancak
Nullable<T>
ile kullanılabilir.
- Performans:
- Class: Referans türü olduğu için heap bellekte yer kaplar ve bellek yönetimi (GC) tarafından yönetilir.
- Struct: Değer türü olduğu için stack bellekte yer kaplar ve genellikle daha performanslıdır.
public class Program
{
public static void Main(string[] args)
{
Person person = new Person("Alice", 30);
person.DisplayInfo(); // Çıktı: Name: Alice, Age: 30
// Property kullanımı
person.Name = "Bob";
person.Age = 25;
person.DisplayInfo(); // Çıktı: Name: Bob, Age: 25
}
}
-
Inheritance (Kalıtım):
- Bir sınıf başka bir sınıftan türetilebilir.
- Örnek:
public class Employee : Person { public int EmployeeId { get; set; } public string Department { get; set; } public Employee(string name, int age, int employeeId, string department) : base(name, age) { EmployeeId = employeeId; Department = department; } public void DisplayEmployeeInfo() { DisplayInfo(); Console.WriteLine($"Employee ID: {EmployeeId}, Department: {Department}"); } }
-
Polymorphism (Çok Biçimlilik):
- Bir sınıfın metodunun, türetilmiş sınıfta farklı şekillerde davranmasını sağlar.
- Örnek:
public class Animal { public virtual void MakeSound() { Console.WriteLine("Some generic animal sound"); } } public class Dog : Animal { public override void MakeSound() { Console.WriteLine("Bark"); } } public class Cat : Animal { public override void MakeSound() { Console.WriteLine("Meow"); } } public class Program { public static void Main(string[] args) { Animal myDog = new Dog(); Animal myCat = new Cat(); myDog.MakeSound(); // Çıktı: Bark myCat.MakeSound(); // Çıktı: Meow } }
-
Encapsulation (Kapsülleme):
- Sınıfın iç verilerinin dışarıdan erişime kapatılması ve kontrollü erişim sağlanması.
- Örnek:
public class BankAccount { private decimal balance; public decimal Balance { get { return balance; } private set { if (value >= 0) balance = value; else throw new ArgumentException("Balance cannot be negative"); } } public void Deposit(decimal amount) { if (amount > 0) Balance += amount; else throw new ArgumentException("Deposit amount must be positive"); } public void Withdraw(decimal amount) { if (amount > 0 && amount <= Balance) Balance -= amount; else throw new ArgumentException("Invalid withdraw amount"); } }
Bu örnekler ve açıklamalar, C#'ta sınıf kavramını ve onun temel özelliklerini kapsamlı bir şekilde ele alır. Sınıflar, nesne yönelimli programlamanın temel taşıdır ve yazılım geliştirme sürecinde kodun yeniden kullanılabilirliği ve organizasyonu için kritik öneme sahiptir.
- Class (Sınıf):
- Referans türüdür.
- Heap bellekte tutulur.
- Bir nesnenin referansını (adresini) saklar.
- Değerleri null olabilir.
- Genellikle daha büyük ve karmaşık veri yapılarını temsil etmek için kullanılır.
- Oluşturulan nesneler üzerinde yapılan değişiklikler, tüm referansların üzerinde etki gösterir.
- Struct (Yapı):
- Değer türüdür.
- Stack bellekte tutulur.
- Değerin kendisini saklar.
- Değerleri null olamaz (varsayılan değerlerle başlatılır).
- Genellikle küçük ve basit veri yapılarını temsil etmek için kullanılır.
- Oluşturulan nesneler kopyalandığında, her kopya bağımsız olarak değiştirilebilir.
- Class:
- Referans türü olduğu için bellekte daha fazla yer kaplar.
- Referansları ve nesne verilerini (heap'te) saklar.
- Struct:
- Değer türü olduğu için bellekte daha az yer kaplar.
- Veriler doğrudan stack bellekte saklanır.
- Class:
- Referanslar üzerinden erişildiği için kopyalama maliyeti daha düşüktür.
- Nesneler referanslarını paylaştıkları için kopyalandığında aynı nesneye erişim sağlar.
- Struct:
- Değerler doğrudan kopyalandığı için kopyalama maliyeti daha yüksektir.
- Oluşturulan her kopya, bağımsız bir veri kümesini temsil eder.
- Class:
- Referanslar null olabilir.
- Yani bir class nesnesi oluşturulduğunda, o nesne null olarak atanabilir.
- Struct:
- Değerler null olamaz.
- Struct tipleri, varsayılan değerlerle (0, false, null vb.) başlatılır.
- Class:
- Kalıtım alabilir (inheritance) ve türetilmiş sınıflar (derived classes) oluşturabilir.
- Birden fazla sınıf tarafından uygulanabilen bir arayüz (interface) sağlayabilir.
- Struct:
- Kalıtım alamaz.
- Struct'lar, System.ValueType sınıfından kalıtım alır ve başka bir sınıftan kalıtım alamazlar.
- Class:
- Karmaşık nesneler, referanslar üzerinden paylaşılması gereken veriler için.
- Kalıtım, arayüzler ve nesne yaşam döngüsü yönetimi gerektiren durumlar için.
- Struct:
- Küçük ve basit veri yapıları, değer tipi performans avantajlarından faydalanmak isteyen durumlar için.
- Heap'te yer ayırmak yerine stack belleği kullanmak isteyen durumlar için.
Özetle, class
ve struct
farklı bellek yönetimi, kopyalama davranışı ve kullanım senaryolarına sahip veri yapılarıdır. Seçim, projenin gereksinimlerine ve performans beklentilerine bağlı olarak yapılmalıdır.
HashTable
, anahtar-değer (key-value) çiftlerini depolamak için kullanılan bir veri yapısıdır. C#'ta System.Collections
namespace'i altında bulunur. HashTable
, anahtarların benzersiz olmasını gerektirir ve anahtarlara hızlı erişim sağlar.
-
Varsayılan Tanımlama:
Hashtable hashtable = new Hashtable();
-
İlk Kapasite ile Tanımlama:
Hashtable hashtable = new Hashtable(100); // 100 eleman için önceden ayarlanmış kapasite
-
Başka Bir Koleksiyonla Tanımlama:
IDictionary initialData = new Dictionary<string, string> { { "key1", "value1" }, { "key2", "value2" } }; Hashtable hashtable = new Hashtable(initialData);
-
Eleman Ekleme:
hashtable.Add("id", 1); hashtable.Add("name", "Alice"); hashtable.Add("age", 30);
-
Eleman Erişimi:
int id = (int)hashtable["id"]; string name = (string)hashtable["name"]; int age = (int)hashtable["age"];
-
Eleman Silme:
hashtable.Remove("age");
-
Kontrol:
bool containsKey = hashtable.ContainsKey("name"); bool containsValue = hashtable.ContainsValue("Alice");
-
Güncelleme:
hashtable["name"] = "Bob";
-
Döngü ile Elemanlara Erişim:
foreach (DictionaryEntry entry in hashtable) { Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}"); }
- Hızlı Erişim: Hashing algoritması sayesinde anahtarlara hızlı erişim sağlar.
- Esneklik: Heterojen veri tiplerini (farklı veri türlerini) depolayabilir.
- Anahtar-Benzersizliği: Aynı anahtar iki kez eklenemez, bu da veri tutarlılığını sağlar.
-
Dictionary (System.Collections.Generic.Dictionary<TKey, TValue>):
-
Farklar:
Dictionary
,HashTable
'a göre daha performanslı ve tür güvenli bir yapı sunar.- Generics kullanılarak tür güvenliği sağlar.
-
Kullanım:
Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictionary.Add("id", 1); dictionary.Add("age", 30); int age = dictionary["age"];
-
-
SortedList:
-
Farklar:
- Anahtar-değer çiftlerini sıralı bir şekilde tutar.
SortedList
, hem anahtara hem de değere göre sıralama yapabilir.
-
Kullanım:
SortedList sortedList = new SortedList(); sortedList.Add("id", 1); sortedList.Add("name", "Alice");
-
-
HashSet (System.Collections.Generic.HashSet):
-
Farklar:
- Sadece benzersiz değerleri tutar (anahtar-değer çiftleri yerine tekil değerler).
- Performans olarak hızlıdır ve set işlemlerini destekler (birleşim, kesişim vb.).
-
Kullanım:
HashSet<int> hashSet = new HashSet<int>(); hashSet.Add(1); hashSet.Add(2); bool contains = hashSet.Contains(2);
-
using System;
using System.Collections;
class Program
{
static void Main()
{
// Hashtable tanımlama
Hashtable hashtable = new Hashtable();
// Eleman ekleme
hashtable.Add("id", 1);
hashtable.Add("name", "Alice");
hashtable.Add("age", 30);
// Eleman erişimi ve güncelleme
Console.WriteLine("Name: " + hashtable["name"]);
hashtable["name"] = "Bob";
Console.WriteLine("Updated Name: " + hashtable["name"]);
// Elemanları listeleme
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}");
}
// Eleman silme
hashtable.Remove("age");
// Kalan elemanları listeleme
Console.WriteLine("After removal:");
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}");
}
}
}
SortedList
, anahtar-değer çiftlerini saklayan ve anahtarlarına göre sıralanmış bir koleksiyon sağlayan bir veri yapısıdır. SortedList
, System.Collections
namespace'inde bulunur. SortedList
'in generic versiyonu ise SortedList<TKey, TValue>
olarak System.Collections.Generic
namespace'inde bulunur.
-
Varsayılan Tanımlama:
SortedList sortedList = new SortedList();
-
Başlangıç Kapasitesi ile Tanımlama:
SortedList sortedList = new SortedList(10);
-
Dictionary'den Kopyalama ile Tanımlama:
Hashtable hashtable = new Hashtable(); SortedList sortedList = new SortedList(hashtable);
-
Eleman Ekleme:
sortedList.Add(1, "Bir"); sortedList.Add(3, "Üç"); sortedList.Add(2, "İki");
-
Eleman Erişimi:
var value = sortedList[1]; // "Bir" döner
-
Eleman Güncelleme:
sortedList[2] = "İkincisi";
-
Eleman Silme:
sortedList.Remove(1);
-
Elemanları Listeleme:
foreach (DictionaryEntry entry in sortedList) { Console.WriteLine($"{entry.Key}: {entry.Value}"); }
-
Varsayılan Tanımlama:
SortedList<int, string> sortedList = new SortedList<int, string>();
-
Başlangıç Kapasitesi ile Tanımlama:
SortedList<int, string> sortedList = new SortedList<int, string>(10);
-
Dictionary'den Kopyalama ile Tanımlama:
Dictionary<int, string> dictionary = new Dictionary<int, string> { { 1, "Bir" }, { 3, "Üç" }, { 2, "İki" } }; SortedList<int, string> sortedList = new SortedList<int, string>(dictionary);
-
Eleman Ekleme:
sortedList.Add(1, "Bir"); sortedList.Add(3, "Üç"); sortedList.Add(2, "İki");
-
Eleman Erişimi:
var value = sortedList[1]; // "Bir" döner
-
Eleman Güncelleme:
sortedList[2] = "İkincisi";
-
Eleman Silme:
sortedList.Remove(1);
-
Elemanları Listeleme:
foreach (KeyValuePair<int, string> entry in sortedList) { Console.WriteLine($"{entry.Key}: {entry.Value}"); }
- Sıralı Veri Saklama:
SortedList
, verileri anahtarlarına göre sıralı şekilde saklar. Bu, verilerin sıralı olarak tutulmasının önemli olduğu durumlarda avantaj sağlar. - Hızlı Arama ve Erişim:
SortedList
,O(log n)
zaman karmaşıklığı ile hızlı arama ve eleman erişimi sağlar.
- Dictionary<TKey, TValue>:
- Tür Güvenliği: Hem
Dictionary
hem deSortedList
tür güvenliği sağlar. - Sıralama:
Dictionary
elemanları sıralı tutmaz,SortedList
ise anahtarlara göre sıralı tutar. - Performans:
Dictionary
, ekleme ve erişim işlemlerindeO(1)
zaman karmaşıklığına sahiptir,SortedList
iseO(log n)
zaman karmaşıklığına sahiptir.
- Tür Güvenliği: Hem
- Hashtable:
- Tür Güvenliği:
Hashtable
tür güvenliği sağlamaz,SortedList
ise generic versiyonunda tür güvenliği sağlar. - Sıralama:
Hashtable
elemanları sıralı tutmaz,SortedList
ise anahtarlara göre sıralı tutar. - Performans:
Hashtable
, ekleme ve erişim işlemlerindeO(1)
zaman karmaşıklığına sahiptir,SortedList
iseO(log n)
zaman karmaşıklığına sahiptir.
- Tür Güvenliği:
- SortedDictionary<TKey, TValue>:
- Sıralama: Hem
SortedList
hem deSortedDictionary
anahtarlara göre sıralı veri saklar. - Veri Erişimi:
SortedList
anahtar ve değerleri dizilerde saklar ve daha az bellek kullanımı sağlar,SortedDictionary
ise bir ikili ağaç yapısı kullanır. - Performans: Genellikle
SortedList
küçük veri kümeleri için daha hızlıdır,SortedDictionary
ise büyük veri kümeleri için daha iyi performans gösterir.
- Sıralama: Hem
C#'da List<T>
, sıklıkla kullanılan ve esnek bir koleksiyon türüdür. List<T>
, aynı türden elemanların dinamik bir listesini tutar ve elemanlara sıralı bir şekilde erişim sağlar. System.Collections.Generic
namespace'i altında bulunur ve ArrayList
gibi diğer eski koleksiyon türlerine kıyasla daha performanslı ve tip güvenlidir.
List<T>
, genellikle boyutu değişken olan bir dizi olarak düşünülebilir. İçerisindeki elemanların sıralı bir şekilde tutulmasını sağlar ve eleman ekleme, çıkarma, arama gibi işlemleri oldukça verimli bir şekilde gerçekleştirir.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Boş bir List<T> oluşturma
List<int> numbers = new List<int>();
// Başlangıç elemanları ile List<T> oluşturma
List<string> fruits = new List<string> { "Elma", "Muz", "Çilek" };
// Başka bir koleksiyondan List<T> oluşturma
int[] initialNumbers = { 1, 2, 3, 4, 5 };
List<int> numberList = new List<int>(initialNumbers);
}
}
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
// Aynı anda birden fazla eleman ekleme
numbers.AddRange(new int[] { 4, 5, 6 });
List<string> fruits = new List<string> { "Elma", "Muz", "Çilek" };
string firstFruit = fruits[0]; // "Elma"
string secondFruit = fruits[1]; // "Muz"
List<string> fruits = new List<string> { "Elma", "Muz", "Çilek" };
fruits[1] = "Kivi"; // "Muz" yerine "Kivi" eklenir
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
numbers.Remove(3); // Değer 3 olan elemanı siler
numbers.RemoveAt(0); // İlk elemanı (1) siler
numbers.RemoveRange(1, 2); // İkinci ve üçüncü elemanları siler
List<string> fruits = new List<string> { "Elma", "Muz", "Çilek" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
- Dinamik Boyut:
List<T>
, boyutu dinamik olarak değişebilen bir veri yapısıdır. Eleman ekledikçe veya çıkardıkça otomatik olarak genişler veya daralır. - Performans:
List<T>
, ekleme, çıkarma ve erişim işlemlerinde oldukça performanslıdır. - Tip Güvenliği:
List<T>
, belirli bir türdeki elemanları tutar, bu da derleme zamanında tip kontrolü sağlar ve tip hatalarını önler. - Zengin Metot ve Özellikler:
List<T>
, eleman ekleme, çıkarma, arama, sıralama gibi birçok yerleşik metot ve özellik sunar.
- Boyut: Dizilerin boyutu sabittir ve oluşturulduktan sonra değiştirilemezken,
List<T>
dinamik olarak boyut değiştirebilir. - Performans: Dizi elemanlarına erişim genellikle
List<T>
'den daha hızlıdır, çünkü diziler doğrudan hafıza adreslerine erişir. - Kullanım Kolaylığı:
List<T>
, eleman ekleme ve çıkarma işlemlerinde daha fazla esneklik sağlar ve kullanımı daha kolaydır.
- Erişim Süresi:
List<T>
, belirli bir indeksdeki elemanlara erişim içinO(1)
zaman karmaşıklığına sahipken,LinkedList<T>
O(n)
zaman karmaşıklığına sahiptir. - Ekleme ve Çıkarma:
LinkedList<T>
, listenin başına veya ortasına eleman ekleme ve çıkarma işlemlerindeList<T>
'den daha etkilidir (çünküList<T>
'de bu işlemler kaydırma gerektirir).
- Tip Güvenliği:
ArrayList
,object
türünde elemanlar tutar ve tip güvenliği sağlamazken,List<T>
belirli bir türdeki elemanları tutar ve tip güvenliği sağlar. - Performans:
List<T>
,ArrayList
'ten daha performanslıdır çünkü boxing/unboxing işlemlerinden kaçınır.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> students = new List<string> { "Ahmet", "Mehmet", "Ayşe", "Fatma" };
// Yeni öğrenciler ekle
students.Add("Ali");
students.AddRange(new string[] { "Veli", "Zeynep" });
// Öğrenci listesini yazdır
Console.WriteLine("Öğrenciler:");
foreach (string student in students)
{
Console.WriteLine(student);
}
// Belirli bir indeksten öğrenciyi sil
students.RemoveAt(2); // "Ayşe"yi siler
// Öğrenci listesini güncelle
students[0] = "Ahmet Yılmaz";
// Öğrencilerden birini ara
int index = students.IndexOf("Fatma");
Console.WriteLine("\\\\nFatma'nın İndeksi: " + index);
// Öğrenci listesini tekrar yazdır
Console.WriteLine("\\\\nGüncellenmiş Öğrenci Listesi:");
foreach (string student in students)
{
Console.WriteLine(student);
}
}
}
C#'da Stack<T>
veri yapısı, LIFO (Last In, First Out) prensibine göre çalışan bir koleksiyondur. Bu veri yapısında, en son eklenen eleman en önce çıkarılır. Stack<T>
, System.Collections.Generic
namespace'i altında bulunur ve belirli bir türdeki elemanları saklayabilir.
Stack<T>
, son giren ilk çıkar (LIFO) mantığıyla çalışan bir veri yapısıdır. Bir yığın düşüncesiyle çalışır; yani en üstteki eleman ilk olarak çıkarılır.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Boş bir Stack<T> oluşturma
Stack<int> numbers = new Stack<int>();
// Başlangıç elemanları ile Stack<T> oluşturma
Stack<string> books = new Stack<string>(new string[] { "Kitap 1", "Kitap 2", "Kitap 3" });
}
}
Stack<int> numbers = new Stack<int>();
numbers.Push(1);
numbers.Push(2);
numbers.Push(3);
int top = numbers.Pop(); // 3'ü çıkarır ve döner
int nextTop = numbers.Pop(); // 2'yi çıkarır ve döner
int top = numbers.Peek(); // Zirvedeki eleman olan 1'i döner fakat çıkarmaz
int count = numbers.Count; // Stack'teki eleman sayısını döner
Stack<string> books = new Stack<string>(new string[] { "Kitap 1", "Kitap 2", "Kitap 3" });
foreach (string book in books)
{
Console.WriteLine(book);
}
- Basitlik:
Stack<T>
, belirli bir sıralama gereksinimi olmayan, sadece en son eklenen elemanı önce çıkarmak isteyen durumlar için basit ve etkili bir çözümdür. - Fonksiyon Çağrıları: Fonksiyon çağrılarını takip etmek, geri izleme işlemleri veya derinlik öncelikli arama algoritmaları gibi durumlarda kullanılabilir.
- Geri Alma İşlemleri: Kullanıcı tarafından yapılan işlemleri geri almak veya tekrarlamak için ideal bir yapıdır.
- Geçici Depolama: Geçici olarak veri saklamak ve işlemek için kullanılır.
- Erişim Düzeni:
Stack<T>
, LIFO (Last In, First Out) mantığıyla çalışırkenQueue<T>
, FIFO (First In, First Out) mantığıyla çalışır. - Kullanım Senaryoları:
Stack<T>
, geri alma işlemleri veya fonksiyon çağrıları için kullanılırken,Queue<T>
sıra tabanlı işlemler (örneğin, iş kuyruğu) için kullanılır.
- Performans:
Stack<T>
, belirli bir amaç için optimize edilmiştir ve LIFO mantığıyla çalışır.LinkedList<T>
ise daha genel amaçlıdır ve hem LIFO hem de FIFO işlemleri destekleyebilir. - Kullanım Kolaylığı:
Stack<T>
, basit LIFO işlemleri için daha kolay bir arayüz sunar.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Stack<string> browserHistory = new Stack<string>();
// Yeni sayfalar ziyaret ediliyor
browserHistory.Push("Anasayfa");
browserHistory.Push("Haberler");
browserHistory.Push("Teknoloji");
Console.WriteLine("Geçmiş:");
// Geçmişi yazdırma
foreach (string page in browserHistory)
{
Console.WriteLine(page);
}
// Bir sayfa geri gitme
string lastVisitedPage = browserHistory.Pop();
Console.WriteLine($"\\\\nSon ziyaret edilen sayfa: {lastVisitedPage}");
// Mevcut sayfayı görüntüleme
string currentPage = browserHistory.Peek();
Console.WriteLine($"Mevcut sayfa: {currentPage}");
Console.WriteLine("\\\\nGüncellenmiş Geçmiş:");
foreach (string page in browserHistory)
{
Console.WriteLine(page);
}
}
}
- Geri Alma (Undo) İşlemleri: Kullanıcıların yaptıkları işlemleri geri alma veya eski duruma döndürme işlemlerinde stack sıklıkla kullanılır. Örneğin, metin düzenleyicilerinde geri alma işlevi stack kullanılarak yönetilir.
- Derinlik Öncelikli Arama (Depth-First Search, DFS): Grafik ve ağaç yapılarında gezinme işlemlerinde stack sıklıkla kullanılır. DFS algoritması stack kullanılarak derinlik öncelikli olarak uygulanır.
- Recursive (Özyinelemeli) fonksiyonlar, her çağrıldıklarında bir çağrı yığını (call stack) oluştururlar. Bu yığın, fonksiyonların çağrılma sırasını ve iç içe geçmiş çağrıları tutar. Örneğin, faktöriyel hesaplama veya fibonacci sayıları gibi rekürsif algoritmalar, stack kullanılarak işlenir.
- Exception handling süreçlerinde (hata işleme) stack, hata anında programın hangi noktada olduğunu ve hangi fonksiyonların çağrıldığını izlemek için kullanılır. Stack trace olarak bilinen bu bilgiler, hataların nedenini belirlemede ve giderilmesinde önemli rol oynar.
- Array İmplementasyonu: Stack, genellikle dinamik boyut gerektirmeyen ve sabit bellek kullanımı sağlamak için array (dizi) veri yapısıyla implemente edilir. Array kullanımı, eleman ekleme ve çıkarma işlemlerinde sabit zaman karmaşıklığı (O(1)) sağlar.
- LinkedList İmplementasyonu: Bazı durumlarda, dinamik boyut gereksinimi olan ve esnek bellek kullanımı sağlayan linked list yapıları stack implementasyonunda tercih edilebilir. Linked list kullanımı, özellikle eleman ekleme ve çıkarma işlemlerinde daha esnek bir yapı sunar.
Queue, verilerin FIFO (First In, First Out - İlk giren, ilk çıkan) prensibine göre işlendiği bir veri yapısıdır. Bu yapıda, ilk eklenen eleman ilk çıkarılır. C# programlama dilinde Queue<T>
sınıfı, System.Collections.Generic namespace'i altında sağlanır. İşte Queue yapısının daha detaylı açıklaması:
Queue<int> queue = new Queue<int>();
Queue<string> names = new Queue<string>(new string[] { "Alice", "Bob", "Charlie" });
queue.Enqueue(10);
queue.Enqueue(20);
queue.Enqueue(30);
int dequeuedItem = queue.Dequeue(); // dequeuedItem = 10
int firstItem = queue.Peek(); // firstItem = 20 (çıkarılmadan)
- Sıralı İşlemler: Queue, işlemleri sıraya almak ve sırayla işlemek için idealdir. Örneğin, bir iş parçacığı havuzunda (thread pool) bekleyen işlemleri yönetmek için kullanılabilir.
- Bekleme Kuyrukları: Birçok senaryoda, gelen talepleri sıraya almak ve ilk gelenin ilk hizmet vermesini sağlamak için kullanılır. Örneğin, işlemci sırası bekleyen müşteri çağrıları gibi.
- Algoritma Uygulamaları: BFS (Breadth-First Search) gibi algoritmalarda genişleme sırasını takip etmek için kullanılabilir.
- Stack (Yığın) ile Farkı: Stack veri yapısında elemanlar LIFO (Last In, First Out) prensibiyle işlenirken, Queue'da FIFO prensibi geçerlidir.
- LinkedList ile Farkı: Queue genellikle sadece başa veya sona ekleme ve çıkarma işlemlerinde etkilidir. LinkedList ise herhangi bir konuma ekleme veya silme işlemleri için daha uygun bir seçenek olabilir.
- ConcurrentQueue: Eşzamansız (thread-safe) işlemler için .NET Framework ve .NET Core'da
ConcurrentQueue
sınıfı sağlanır. Birden fazla iş parçacığı tarafından güvenli bir şekilde erişilebilir. - PriorityQueue: C# standard kütüphanesinde PriorityQueue doğrudan bulunmamaktadır. Ancak öncelikli işlemler gerektiren durumlar için, ekstra kodlama ile Queue yapısı öncelikli kuyruk olarak kullanılabilir.
csharpKodu kopyala
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Bir Queue oluşturma
Queue<string> queue = new Queue<string>();
// Queue'ye eleman ekleme
queue.Enqueue("Öğrenci 1");
queue.Enqueue("Öğrenci 2");
queue.Enqueue("Öğrenci 3");
// Queue'den eleman çıkarma ve yazdırma
while (queue.Count > 0)
{
string student = queue.Dequeue();
Console.WriteLine("Öğrenci çıkarıldı: " + student);
}
}
}
LinkedList, verilerin çift yönlü bağlı listeler şeklinde organize edildiği bir veri yapısıdır. C# programlama dilinde LinkedList<T>
sınıfı, System.Collections.Generic namespace'i altında sağlanır. İşte LinkedList yapısının detaylı açıklaması:
LinkedList<int> linkedList = new LinkedList<int>();
LinkedList<string> names = new LinkedList<string>(new string[] { "Alice", "Bob", "Charlie" });
linkedList.AddLast(10); // Listenin sonuna eleman ekleme
linkedList.AddFirst(5); // Listenin başına eleman ekleme
linkedList.Remove(10); // Değerine göre eleman çıkarma
linkedList.RemoveFirst(); // Listenin başındaki elemanı çıkarma
linkedList.RemoveLast(); // Listenin sonundaki elemanı çıkarma
foreach (var item in linkedList)
{
Console.WriteLine(item);
}
- Esnek Boyutlama: LinkedList, elemanların bellekte rastgele yerleştirildiği ve elemanların dinamik olarak eklenebildiği veya çıkarılabildiği bir veri yapısıdır. Bu özelliği sayesinde, koleksiyon boyutunun dinamik olarak büyümesine veya küçülmesine izin verir.
- Performans: Belirli durumlarda, özellikle listenin ortasından veya sonundan eleman ekleme ve çıkarma işlemlerinde, LinkedList bazı durumlarda daha iyi performans gösterebilir. Çünkü bu işlemler bağlı listelerde daha hızlı gerçekleştirilebilir.
- ArrayList ile Farkı: ArrayList, elemanların ardışık bellek bölgesinde depolandığı bir dizi yapısıdır. LinkedList ise elemanlar bağlantılı düğümler halinde depolanır. Bu nedenle, ArrayList eleman erişimi ve dizinleme için daha hızlı olabilirken, LinkedList ekleme ve çıkarma işlemleri için daha avantajlı olabilir.
- Queue ve Stack ile Farkı: Queue ve Stack veri yapıları sırasıyla FIFO (First In, First Out) ve LIFO (Last In, First Out) prensiplerine göre çalışırken, LinkedList daha genel amaçlı bir veri yapısıdır ve elemanların sırası önemlidir.
- DoublyLinkedList:
LinkedList<T>
sınıfı C# standard kütüphanesinde çift yönlü bağlı listeleri temsil eder. Her düğümün hem bir önceki hem de bir sonraki düğümü işaret ettiği çift yönlü bağlı listelerdir. - Performans: LinkedList'in performans avantajı, eleman ekleme ve çıkarma işlemleri sırasında ortaya çıkar. Ancak eleman erişimi (indeksleme) ArrayList gibi dizilere göre daha yavaş olabilir.
csharpKodu kopyala
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Bir LinkedList oluşturma
LinkedList<string> linkedList = new LinkedList<string>();
// LinkedList'e eleman ekleme
linkedList.AddLast("Öğrenci 1");
linkedList.AddLast("Öğrenci 2");
linkedList.AddLast("Öğrenci 3");
// Bir elemanı araya ekleme
LinkedListNode<string> node = linkedList.Find("Öğrenci 2");
linkedList.AddAfter(node, "Yeni Öğrenci");
// LinkedList üzerinde döngü ve yazdırma
foreach (string student in linkedList)
{
Console.WriteLine("Öğrenci: " + student);
}
}
}
Dictionary, anahtar-değer çiftlerini depolayan ve hızlı erişim sağlayan bir koleksiyon yapısıdır. C# programlama dilinde Dictionary<TKey, TValue>
sınıfı olarak sunulur ve System.Collections.Generic namespace'i altında bulunur. İşte Dictionary yapısının detaylı açıklaması:
Dictionary<string, int> ages = new Dictionary<string, int>();
Dictionary<string, string> capitals = new Dictionary<string, string>()
{
{ "Turkey", "Ankara" },
{ "France", "Paris" },
{ "UK", "London" }
};
ages["Alice"] = 30; // Anahtar "Alice" ile değer ekleme veya güncelleme
ages["Bob"] = 25;
ages["Charlie"] = 40;
ages.Remove("Bob"); // Anahtara göre eleman silme
int charliesAge = ages["Charlie"]; // Anahtar üzerinden değere erişim
foreach (var country in capitals.Keys)
{
Console.WriteLine($"Capital of {country} is {capitals[country]}");
}
- Hızlı Erişim: Anahtarlar üzerinden hızlı erişim sağlar. Anahtar-değer çiftleri, hash tablosu gibi bir yapıda yönetilir, bu da arama ve erişim işlemlerinin genellikle O(1) karmaşıklığında olmasını sağlar.
- Veri Yapısı İle Uyumluluk: Veri yapılarından biri olarak, anahtar-değer çiftleriyle ilişkili verileri gruplamak ve organize etmek için kullanılır.
- Hashtable ile Farkı: Dictionary, hashtable'ın generic bir versiyonudur ve genellikle daha tip güvenli ve kullanımı kolaydır. Hashtable'da anahtarlar ve değerler object türünde saklanırken, Dictionary'de tür güvenliği sağlayan generic yapı kullanılır.
- List, Stack, ve Queue ile Farkı: List, Stack, ve Queue sırasıyla dinamik bir dizi, LIFO (Last In, First Out) ve FIFO (First In, First Out) prensiplerine göre çalışan veri yapılarıdır. Dictionary ise anahtar-değer çiftleri için özel olarak optimize edilmiş bir yapıdır ve arama, ekleme ve çıkarma işlemlerinde farklı bir performans profili sunar.
- Performance ve İşlem Karmaşıklığı: Dictionary, anahtarların hash değerlerine dayalı olarak organize edildiği için arama, ekleme ve çıkarma işlemlerinde genellikle O(1) zaman karmaşıklığına sahiptir. Ancak, bu performans genellikle yüksek doluluk oranlarına sahipse azalabilir.
- Null Anahtarlar ve Değerler: Dictionary'de anahtarlar null olamaz, ancak değerler null olabilir.
- ValueCollection ve KeyCollection: Dictionary sınıfı, değerlerin ve anahtarların koleksiyonlarını (ValueCollection ve KeyCollection) sağlar, bu koleksiyonlar üzerinde işlemler yapılabilir.
csharpKodu kopyala
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Bir Dictionary oluşturma
Dictionary<string, string> capitals = new Dictionary<string, string>();
// Dictionary'ye eleman ekleme
capitals["Turkey"] = "Ankara";
capitals["France"] = "Paris";
capitals["Germany"] = "Berlin";
// Dictionary üzerinde döngü ve yazdırma
foreach (KeyValuePair<string, string> kvp in capitals)
{
Console.WriteLine("Ülke: " + kvp.Key + ", Başkent: " + kvp.Value);
}
// Bir değeri güncelleme
capitals["Turkey"] = "İstanbul";
// Bir değeri silme
capitals.Remove("France");
// Dictionary'den bir değeri arama
if (capitals.ContainsKey("Germany"))
{
string capital = capitals["Germany"];
Console.WriteLine("\\nAlmanya'nın Başkenti: " + capital);
}
}
}
SortedList, anahtar-değer çiftlerini sıralı bir şekilde saklayan bir koleksiyon yapısıdır. Her anahtarın tek bir değeri vardır ve anahtarlar sıralı bir şekilde tutulur.
1. Tanımlama Örnekleri:
// SortedList tanımlama ve ilk değerlerle başlatma
SortedList<int, string> sortedList = new SortedList<int, string>();
sortedList.Add(3, "Üç");
sortedList.Add(1, "Bir");
sortedList.Add(2, "İki");
2. Kullanım Örnekleri:
-
Anahtarlarla değerlere erişim:
Console.WriteLine(sortedList[1]); // "Bir" çıktısını verir
-
Anahtar-değer ekleme:
sortedList.Add(4, "Dört");
-
Değer güncelleme:
sortedList[2] = "Two";
-
Anahtarları ve değerleri döngü ile işleme:
foreach (var key in sortedList.Keys) { Console.WriteLine($"Anahtar: {key}, Değer: {sortedList[key]}"); }
3. Neden Kullanılır?
SortedList, anahtarların sıralı bir şekilde tutulmasını sağlar ve bu nedenle anahtarlar arası arama işlemleri hızlıdır. Özellikle sıralı erişim gerektiren durumlarda tercih edilir.
4. Benzer Diğer Veri Yapılarıyla Farkları:
- Dictionary: Dictionary, anahtarlar arasında sıralama yapmaz ve sıralı erişim sağlamaz. Ancak, anahtar bazında hızlı erişim sunar.
- List: Liste sıralı değilken, SortedList sıralı bir yapıdır. Listeler genelde sıralı erişim veya sıralama gerektirmeyen durumlar için kullanılır.
Aşağıda, bir telefon rehberi uygulaması için SortedList kullanımını gösteren kapsamlı bir örnek verilmiştir:
using System;
using System.Collections;
class Program
{
static void Main()
{
SortedList<string, string> phoneBook = new SortedList<string, string>();
// Telefon rehberine kişi ekleme
phoneBook.Add("Ali", "555-1234");
phoneBook.Add("Veli", "555-5678");
phoneBook.Add("Zeynep", "555-2468");
// Kişileri listeleme
Console.WriteLine("Telefon Rehberi:");
foreach (var person in phoneBook)
{
Console.WriteLine($"İsim: {person.Key}, Telefon: {person.Value}");
}
// Yeni kişi ekleme
phoneBook.Add("Ahmet", "555-7890");
// Kişileri tekrar listeleme
Console.WriteLine("\\\\nYeni Telefon Rehberi:");
foreach (var person in phoneBook)
{
Console.WriteLine($"İsim: {person.Key}, Telefon: {person.Value}");
}
// Belirli bir kişiyi güncelleme
phoneBook["Ali"] = "555-4321";
// Güncellenmiş kişileri listeleme
Console.WriteLine("\\\\nGüncellenmiş Telefon Rehberi:");
foreach (var person in phoneBook)
{
Console.WriteLine($"İsim: {person.Key}, Telefon: {person.Value}");
}
}
}
SortedSet, benzersiz öğeleri sıralı bir şekilde tutan bir koleksiyon yapısıdır. Bu yapının en büyük özelliği, içindeki öğelerin sıralı bir şekilde tutulması ve her öğenin sadece bir kez bulunabilmesidir.
1. Tanımlama Örnekleri:
// SortedSet tanımlama
SortedSet<int> numbers = new SortedSet<int>();
// İlk değerlerle başlatma
SortedSet<string> names = new SortedSet<string>(new string[] { "Alice", "Bob", "Charlie" });
2. Kullanım Örnekleri:
-
Öğe ekleme:
numbers.Add(5); numbers.Add(3); numbers.Add(8);
-
Öğe silme:
numbers.Remove(3);
-
Öğe varlığını kontrol etme:
if (numbers.Contains(8)) { Console.WriteLine("Listede 8 var."); }
-
Sıralı öğeleri döngü ile işleme:
foreach (var number in numbers) { Console.WriteLine(number); }
3. Neden Kullanılır?
SortedSet, öğelerin sıralı bir şekilde tutulmasını sağlar ve her öğenin yalnızca bir kez bulunabileceği garantisini verir. Bu özellikle sıralama gerektiren durumlarda ve benzersiz öğelerin tutulmasında kullanılır.
4. Benzer Diğer Veri Yapılarıyla Farkları:
- HashSet: HashSet de benzersiz öğeleri tutar ancak sıralı bir yapı sunmaz. SortedSet ise öğeleri sıralı tutar.
- List: List sıralı değilken, SortedSet sıralı bir yapıdır ve benzersiz öğeler içerir.
Aşağıda, bir puan takip uygulaması için SortedSet kullanımını gösteren kapsamlı bir örnek verilmiştir:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
SortedSet<int> highScores = new SortedSet<int>();
// Yüksek skorları ekleyelim
highScores.Add(450);
highScores.Add(670);
highScores.Add(300);
highScores.Add(800);
highScores.Add(550);
// En yüksek skoru bulalım
int highestScore = highScores.Max;
Console.WriteLine($"En yüksek skor: {highestScore}");
// En düşük skoru bulalım ve silelim
int lowestScore = highScores.Min;
highScores.Remove(lowestScore);
Console.WriteLine($"En düşük skor: {lowestScore}");
// Sıralı skorları listeleme
Console.WriteLine("\\\\nSıralı Skorlar:");
foreach (var score in highScores)
{
Console.WriteLine(score);
}
}
}