C#-ში ინდექსები რა არის? რა ტიპის ინდექსები არსებობს და იყენებდით მათ პრაქტიკაში?
sobes.tech AI
პასუხი AI-სგან
ინდექსატორები C#-ში საშუალებას აძლევენ კლასის ან სტრუქტურის მაგალითს მიმართოს მასივის მსგავსად, სინტაქსის [] გამოყენებით. ისინი არ არიან სტატიკური და გადახედავენ [] ოპერატორს.
ინდექსატორები
ინდექსატორები საშუალებას აძლევენ განსაზღვროთ წვდომის ლოგიკა კოლექციის ან მონაცემთა სტრუქტურის ელემენტებზე კლასის შიგნით.
public class MyCollection
{
private string[] data = new string[10];
// ინდექსატორი, რომელიც საშუალებას აძლევს მიიღოს ან დაყენოს ელემენტი ინდექსის მიხედვით
public string this[int index]
{
get
{
// საზღვრების შემოწმება
if (index >= 0 && index < data.Length)
{
return data[index];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// საზღვრების შემოწმება
if (index >= 0 && index < data.Length)
{
data[index] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
ინდექსატორების პარამეტრების ტიპები
ინდექსატორები შეიძლება მიიღონ ნებისმიერი რაოდენობის პარამეტრები ნებისმიერი ტიპის, არა მხოლოდ მთელი რიცხვების.
public class DictionaryLike
{
private Dictionary<string, string> _dictionary = new Dictionary<string, string>();
// ინდექსატორი string ტიპის პარამეტრით
public string this[string key]
{
get
{
if (_dictionary.ContainsKey(key))
{
return _dictionary[key];
}
else
{
return null; // ან გამონაკლისის გამოტანა
}
}
set
{
_dictionary[key] = value;
}
}
}
ინდექსატორების გადატვირთვა
შეგვიძლია შევქმნათ გადატვირთული ინდექსატორები სხვადასხვა სიგნატურით (პარამეტრების ნაკრებით და ტიპებით).
public class Matrix
{
private int[,] data;
public Matrix(int rows, int cols)
{
data = new int[rows, cols];
}
// ორი მთელი რიცხვის პარამეტრით ინდექსატორი
public int this[int row, int col]
{
get
{
// საზღვრების შემოწმება
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
return data[row, col];
}
else
{
throw new IndexOutOfRangeException();
}
}
set
{
// საზღვრების შემოწმება
if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
{
data[row, col] = value;
}
else
{
throw new IndexOutOfRangeException();
}
}
}
}
Range-ები და ინდექსები (Ranges & Indices)
C# 8.0-ში შემოვიდა ახალი ტიპები System.Index და System.Range, რომლებიც საშუალებას აძლევენ გამოიყენოთ სინტაქსი კოლექციის ბოლო ელემენტებზე მიმართვისთვის (^) და სუბ-დიაპაზონის მიღებისთვის (..). ამ გაგებით ისინი ხშირად უწოდებენ "ინდექსებს", მაგრამ განსხვავდებიან კლასიკური ინდექსატორებისგან.
using System;
public class ArrayExample
{
public static void Main(string[] args)
{
string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };
// System.Index-ის გამოყენება ბოლო ელემენტზე წვდომისთვის
Index last = ^1; // ბოლო ელემენტის ინდექსი
Console.WriteLine(words[last]); // dog
// System.Range-ის გამოყენება სუბ-დიაპაზონის მისაღებად
Range middle = 1..4; // ელემენტები ინდექსებიდან 1-დან 4-მდე (არ მოიცავს 4-ს)
string[] subset = words[middle]; // {"quick", "brown", "fox"}
// Range-ის გამოყენება System.Index-თან ერთად
Range fromEnd = ^3..; // მესამე ბოლოიდან დაწყებული ბოლომდე
string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
}
}
პრაქტიკული გამოყენება
მე აქტიურად ვიყენებდი ინდექსატორებს საკუთარი კოლექციის კლასების ან ობგურზების შექმნისას, რათა მონაცემებზე უფრო ინტუიტიური წვდომა უზრუნველყო. მაგალითად:
- მატრიცების ან მრავალმეტრიან მონაცემთა კლასების შექმნა, სადაც წვდომა კოორდინატებით
matrix[row, col]ლოგიკურია. - ობგურზების შექმნა
Dictionary<>ან სხვა კოლექციებზე, სადაც გასაღებით წვდომა ინდექსატორით კოდის წაკითხვას ამარტივებს. - სადაც სჭირდება სინტაქსის სიმარტივე, როგორც მასივში.
Range-ები (System.Index და System.Range) გამოიყენება უფრო მოკლე წვდომისთვის მასივების ან სია-ლისტების ნაწილებზე, რაც განსაკუთრებით სასარგებლოა სუბსტრინგების ან ნაწილობრივი მონაცემების მუშაობისას.