Kas ir indeksi C#? Kādi indeksa veidi pastāv un vai esat tos izmantojis praksē?
sobes.tech AI
Atbilde no AI
C# indeksatori ļauj piekļūt klases vai struktūras eksemplāram kā masīvam, izmantojot sintaksi []. Tie nav statiski un pārdefinē operatoru [].
Indeksatori
Indeksatori ļauj definēt piekļuves loģiku kolekcijas elementiem vai datu struktūrai klasē.
public class MyCollection
{
private string[] data = new string[10];
// Indeksators, kas ļauj iegūt vai iestatīt elementu pēc indeksa
public string this[int index]
{
get
{
// Robežu pārbaude
if (index >= 0 && index < data.Length)
{
return data[index];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Robežu pārbaude
if (index >= 0 && index < data.Length)
{
data[index] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Indeksatoru tipi
Indeksatori var pieņemt jebkādu parametru skaitu un tipu, ne tikai veselos skaitļos.
public class DictionaryLike
{
private Dictionary<string, string> _dictionary = new Dictionary<string, string>();
// Indeksators ar string tipu
public string this[string key]
{
get
{
if (_dictionary.ContainsKey(key))
{
return _dictionary[key];
}
else
{
return null; // vai izsaukt izņēmumu
}
}
set
{
_dictionary[key] = value;
}
}
}
Pārkrauti indeksatori
Var izveidot pārkrautus indeksatorus ar dažādām parakstām (parametru kopām un tipiem).
public class Matrix
{
private int[,] data;
public Matrix(int rows, int cols)
{
data = new int[rows, cols];
}
// Indeksators ar diviem veselo skaitļu parametriem
public int this[int row, int col]
{
get
{
// Robežu pārbaude
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
return data[row, col];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Robežu pārbaude
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
data[row, col] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Diapazona indeksi (Ranges & Indices)
No C# 8.0 tika ieviesti jauni System.Index un System.Range tipi, kas ļauj izmantot sintaksi, lai piekļūtu elementiem no kolekcijas beigām (^) un iegūtu apakšdiapazonus (..). Šie jēdzieni bieži saukti par "indeksu", bet tie atšķiras no klasiskajiem indeksatoriem.
using System;
public class ArrayExample
{
public static void Main(string[] args)
{
string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };
// Izmantojot System.Index, lai piekļūtu no beigām
Index last = ^1; // Pēdējā elementa indekss
Console.WriteLine(words[last]); // dog
// Izmantojot System.Range, lai iegūtu apakšdiapazonu
Range middle = 1..4; // Elementi no indeksa 1 līdz (neiekļaujot) indeksam 4
string[] subset = words[middle]; // {"quick", "brown", "fox"}
// Range ar System.Index
Range fromEnd = ^3..; // no trešā no beigām līdz beigām
string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
}
}
Praktiska pielietojuma piemēri
Es aktīvi izmantoju indeksatorus, izveidojot savas kolekciju klases vai apvalkus virs esošajām, lai nodrošinātu intuitīvāku piekļuvi datiem. Piemēram:
- Klasu izstrāde, kas pārstāv matricu vai daudzdimensiju datus, kur piekļuve pēc koordinātām
matrix[row, col]ir loģiska. - Apvalku izveide virs
Dictionary<>vai citu kolekciju, kur piekļuve pēc atslēgas ar indeksatoru uzlabo koda lasāmību. - Vienkāršās kolekcijās, kur bija nepieciešama sintakses ērtība piekļuvei, līdzīga masīvam.
Diapazona indeksi (System.Index un System.Range) tika izmantoti, lai ērtāk piekļūtu masīvu vai sarakstu daļām, kas īpaši noderīgi, strādājot ar virknes vai daļēju kolekciju daļām.