C#-da indekslər nədir? Hansı indeks növləri mövcuddur və onları praktiki olaraq istifadə etdinizmi?
sobes.tech Süni İntellekt
AI-dan cavab
C#-də indeksatorlar sinif və ya struktur nümunəsinə massiv kimi müraciət etməyə imkan verir, [] sintaksisi istifadə edərək. Onlar statik deyil və [] operatorunu yükləyirlər.
İndeksatorlar
İndeksatorlar sinif daxilində kolleksiya və ya məlumat strukturlarına giriş loqikasını müəyyən etməyə imkan verir.
public class MyCollection
{
private string[] data = new string[10];
// İndeksator, elementin indeksə görə alınması və ya təyin olunması üçün
public string this[int index]
{
get
{
// Sərhəd yoxlaması
if (index >= 0 && index < data.Length)
{
return data[index];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Sərhəd yoxlaması
if (index >= 0 && index < data.Length)
{
data[index] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
İndeksator parametrlərinin növləri
İndeksatorlar istənilən sayda və hər hansı tiplərdə parametrlər qəbul edə bilər, yalnız tam ədədlərlə məhdudlaşmır.
public class DictionaryLike
{
private Dictionary<string, string> _dictionary = new Dictionary<string, string>();
// String tipli parametr ilə indeksator
public string this[string key]
{
get
{
if (_dictionary.ContainsKey(key))
{
return _dictionary[key];
}
else
{
return null; // və ya istənilən istisna
}
}
set
{
_dictionary[key] = value;
}
}
}
İndeksatorların yüklənməsi
Fərqli parametr və tiplərlə yüklənmiş indeksatorlar yaradıla bilər.
public class Matrix
{
private int[,] data;
public Matrix(int rows, int cols)
{
data = new int[rows, cols];
}
// İki tam ədəd parametrli indeksator
public int this[int row, int col]
{
get
{
// Sərhəd yoxlaması
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
return data[row, col];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Sərhəd yoxlaması
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
data[row, col] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Aralıq indekslər (Ranges & Indices)
C# 8.0 ilə System.Index və System.Range yeni turlar tanıdıldı, onlar massiv elementlərinə sonundan müraciət (^) və alt aralıq alma (..) üçün sintaksis təmin edir. Bu anlayışlar çox vaxt "indeks" adlandırılır, amma onlar klassik indeksatorlardan fərqlidir.
using System;
public class ArrayExample
{
public static void Main(string[] args)
{
string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };
// System.Index istifadə edərək sonundan müraciət
Index last = ^1; // son elementin indeksi
Console.WriteLine(words[last]); // dog
// System.Range istifadə edərək alt aralıq alma
Range middle = 1..4; // 1-indeksindən 4-ə qədər (4 daxil deyil)
string[] subset = words[middle]; // {"quick", "brown", "fox"}
// System.Index ilə Range
Range fromEnd = ^3..; // sondan üçüncü elementdən başlayaraq
string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
}
}
Tətbiqi nümunə
Mən indeksatorlardan aktiv istifadə etdim öz kolleksiya siniflərimi və ya mövcud kolleksiyalar üzərində daha intuitiv giriş təmin etmək üçün. Məsələn:
- Matrisalar və ya çoxölçülü məlumatları təmsil edən siniflərin yaradılması, burada
matrix[row, col]giriş məntiqli idi. Dictionary<>və ya digər kolleksiyalar üzərində wrapper-lər yaratmaq, burada açar üzrə giriş kodun oxunuşunu yaxşılaşdırır.- Sadə kolleksiyalarda, array kimi sintaktik rahat giriş üçün.
Range indeksləri (System.Index və System.Range) massivlər və ya siyahıların hissələrinə daha qısa giriş üçün istifadə edildi, bu xüsusilə alt sətirlər və ya kolleksiyadan qismən məlumatlar ilə işləməkdə faydalıdır.