C#'ta indeksler nedir? Hangi indeks türleri var ve bunları pratikte kullandınız mı?
sobes.tech yapay zeka
AI'dan gelen yanıt
C# dilinde indeksleyiciler, bir sınıf veya yapının örneğine [] sözdizimini kullanarak dizi gibi erişmenizi sağlar. Statik değiller ve [] operatörünü aşırı yüklerler.
İndeksleyiciler
İndeksleyiciler, bir sınıf içindeki koleksiyon veya veri yapısına erişim mantığını tanımlamanıza olanak tanır.
public class MyCollection
{
private string[] data = new string[10];
// Bir indekse göre öğe alma veya ayarlama imkanı sağlayan indeksleyici
public string this[int index]
{
get
{
// Sınır kontrolü
if (index >= 0 && index < data.Length)
{
return data[index];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Sınır kontrolü
if (index >= 0 && index < data.Length)
{
data[index] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
İndeksleyicilerin parametre tipleri
İndeksleyiciler, sadece tam sayı tipleriyle sınırlı olmamak üzere herhangi sayıda ve herhangi tipte parametre alabilir.
public class DictionaryLike
{
private Dictionary<string, string> _dictionary = new Dictionary<string, string>();
// string tipinde parametre alan indeksleyici
public string this[string key]
{
get
{
if (_dictionary.ContainsKey(key))
{
return _dictionary[key];
}
else
{
return null; // veya istisna fırlat
}
}
set
{
_dictionary[key] = value;
}
}
}
İndeksleyicilerin aşırı yüklenmesi
Farklı imzalarla (parametre kümesi ve tipleri) aşırı yüklenmiş indeksleyiciler oluşturulabilir.
public class Matrix
{
private int[,] data;
public Matrix(int rows, int cols)
{
data = new int[rows, cols];
}
// İki tam sayı parametreli indeksleyici
public int this[int row, int col]
{
get
{
// Sınır kontrolü
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
return data[row, col];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Sınır kontrolü
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
data[row, col] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Aralık indeksleri (Ranges & Indices)
C# 8.0 ile System.Index ve System.Range adlı yeni türler tanıtıldı. Bu türler, koleksiyonun sonundan öğelere erişmek (^) ve alt aralıklar almak (..) için sözdizimi kullanmanıza olanak tanır. Bu kavramlar genellikle "indeksler" olarak adlandırılır, ancak klasik indeksleyicilerden farklıdır.
using System;
public class ArrayExample
{
public static void Main(string[] args)
{
string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };
// Sonundan erişim için System.Index kullanımı
Index last = ^1; // Son öğenin indeksi
Console.WriteLine(words[last]); // dog
// Alt dizi almak için System.Range kullanımı
Range middle = 1..4; // 1. indeksten 4. indekse kadar (dahil değil)
string[] subset = words[middle]; // {"quick", "brown", "fox"}
// System.Index kullanımıyla Range
Range fromEnd = ^3..; // sondan üçüncü öğeden sona kadar
string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
}
}
Pratikte kullanım
Kendi koleksiyon sınıflarımı veya mevcut koleksiyonlar üzerinde sarmalayıcılar oluşturarak daha sezgisel veri erişimi sağlamak için indeksleyicileri aktif olarak kullandım. Örneğin:
- Matrisleri veya çok boyutlu verileri temsil eden sınıflar geliştirme, burada
matrix[row, col]erişimi mantıklı olur. Dictionary<>veya diğer koleksiyonlar üzerinde sarmalayıcılar oluşturma, burada anahtar üzerinden erişim kodun okunabilirliğini artırır.- Basit koleksiyonlarda, dizilere benzer sözdizimiyle erişim kolaylığı sağlar.
Range indeksleri (System.Index ve System.Range) kullanarak dizilerin veya listelerin parçalarına daha özlü erişim sağladım, bu özellikle alt dizeler veya koleksiyondan kısmi verilerle çalışırken faydalıdır.