C# da indekslar nima? Qanday indeks turlari mavjud va ularni amalda ishlatdingizmi?
sobes.tech AI
AIdan javob
C# dagi indeksatorlar sinf yoki strukturaga massiv sifatida murojaat qilish imkonini beradi, [] sintaksisi yordamida. Ular statik emas va [] operatorini ortiqcha yuklashadi.
Indeksatorlar
Indeksatorlar sinf ichida kolleksiya yoki ma'lumotlar tuzilmasiga kirish logikasini belgilash imkonini beradi.
public class MyCollection
{
private string[] data = new string[10];
// Indeksator, elementni indeks bo'yicha olish yoki o'rnatish imkonini beradi
public string this[int index]
{
get
{
// Chegara tekshiruvi
if (index >= 0 && index < data.Length)
{
return data[index];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Chegara tekshiruvi
if (index >= 0 && index < data.Length)
{
data[index] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Indeksator parametrlarining turlari
Indeksatorlar har qanday parametrlar sonini va turini qabul qilishi mumkin, faqat butun son turlariga cheklanmagan.
public class DictionaryLike
{
private Dictionary<string, string> _dictionary = new Dictionary<string, string>();
// String turidagi parametr bilan indeksator
public string this[string key]
{
get
{
if (_dictionary.ContainsKey(key))
{
return _dictionary[key];
}
else
{
return null; // yoki istalgan holda xato chiqarish
}
}
set
{
_dictionary[key] = value;
}
}
}
Indeksatorlarni ortiqcha yuklash
Turli parametrlar to'plami va turlari bilan ortiqcha yuklangan indeksatorlar yaratish mumkin.
public class Matrix
{
private int[,] data;
public Matrix(int rows, int cols)
{
data = new int[rows, cols];
}
// Ikki butun parametrli indeksator
public int this[int row, int col]
{
get
{
// Chegara tekshiruvi
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
return data[row, col];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Chegara tekshiruvi
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
data[row, col] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Oraliq indekslar (Ranges & Indices)
C# 8.0 da System.Index va System.Range turlari kiritildi, ular massiv elementlariga oxiridan murojaat qilish (^) va bo'laklarni olish (..) uchun sintaksis taqdim etadi. Bu tushunchalar "indekslar" deb ataladi, lekin ular klassik indeksatorlardan farq qiladi.
using System;
public class ArrayExample
{
public static void Main(string[] args)
{
string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };
// System.Index yordamida oxiridan murojaat
Index last = ^1; // oxirgi element indeksi
Console.WriteLine(words[last]); // dog
// System.Range yordamida bo'lak olish
Range middle = 1..4; // 1-indeksdan 4-gacha (4 ni o'z ichiga olmaydi)
string[] subset = words[middle]; // {"quick", "brown", "fox"}
// System.Index bilan Range
Range fromEnd = ^3..; // uchinchi element oxiridan boshlab
string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
}
}
Amaliy qo'llanma
Men indeksatorlarni o'z kolleksiyalarim yoki mavjud kolleksiyalar ustida o'zgarishlar qilish uchun keng qo'lladim, masalan:
- Matritsalar yoki ko'p o'lchovli ma'lumotlarni ifodalovchi sinflar yaratishda, masalan,
matrix[row, col]kirish mantiqiy bo'lsa. Dictionary<>yoki boshqa kolleksiyalar ustida o'zgarishlar qilish uchun, kalit bo'yicha indeksator yordamida kod o'qilishi yaxshilandi.- Oddiy kolleksiyalar uchun, massivga o'xshash sintaktik qulaylik bilan kirish.
Range indekslari (System.Index va System.Range) massivlar yoki ro'yxatlarga qisqaroq kirish uchun ishlatiladi, bu ayniqsa substringlar yoki kolleksiyadan qisman ma'lumotlar bilan ishlashda foydalidir.