Mis on indeksid C#-s? Millised indeksitüübid on olemas ja kas olete neid praktikas kasutanud?
sobes.tech AI
Vastus AI-lt
C# indeksatorid võimaldavad pöörduda klassi või struktuuri eksemplari kui massiivi, kasutades süntaksit []. Nad ei ole staatilised ning ülekoormavad [] operaatorit.
Indeksatorid
Indeksatorid võimaldavad määratleda juurdepääsuloogika kogumitelementidele või andmestruktuurile klassi sees.
public class MyCollection
{
private string[] data = new string[10];
// Indeksator, mis võimaldab saada või määrata elementi indeksi järgi
public string this[int index]
{
get
{
// Piirangute kontroll
if (index >= 0 && index < data.Length)
{
return data[index];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Piirangute kontroll
if (index >= 0 && index < data.Length)
{
data[index] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Indeksatorite tüübid
Indeksatorid võivad võtta vastu mistahes arvu ja tüüpi parameetreid, mitte ainult täisarvulisi.
public class DictionaryLike
{
private Dictionary<string, string> _dictionary = new Dictionary<string, string>();
// Indeksator string-tüüpi parameetriga
public string this[string key]
{
get
{
if (_dictionary.ContainsKey(key))
{
return _dictionary[key];
}
else
{
return null; // või visata erind
}
}
set
{
_dictionary[key] = value;
}
}
}
Ülekoormatud indeksatorid
Võib luua ülekoormatud indeksatoreid erinevate signatuuridega (parameetrite kogum ja tüübid).
public class Matrix
{
private int[,] data;
public Matrix(int rows, int cols)
{
data = new int[rows, cols];
}
// Indeksator kahe täisarvulise parameetriga
public int this[int row, int col]
{
get
{
// Piirangute kontroll
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
return data[row, col];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// Piirangute kontroll
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
data[row, col] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Vahemiku indeksid (Ranges & Indices)
Alates C# 8.0 on sisse viidud uued tüübid System.Index ja System.Range, mis võimaldavad kasutada süntaksit elementidele juurdepääsuks lõpu poole (^) ja alamvahemike saamiseks (..). Neid mõisteid nimetatakse sageli "indeksiteks", kuid need erinevad klassikalistest indeksatoritest.
using System;
public class ArrayExample
{
public static void Main(string[] args)
{
string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };
// Kasutades System.Index lõpu poole pöördumiseks
Index last = ^1; // Viimane element
Console.WriteLine(words[last]); // dog
// Kasutades System.Range alamvahemiku saamiseks
Range middle = 1..4; // Elementidest indeksiga 1 kuni (mitte kaasa arvatud) indeksiga 4
string[] subset = words[middle]; // {"quick", "brown", "fox"}
// Range kasutades System.Index
Range fromEnd = ^3..; // kolmas lõpu poole ja kuni lõpuni
string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
}
}