Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

المفهرسات (Indexers (this[]))

جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 37 من 70.

تسمح لك المفهرسات (Indexers) بالوصول إلى العناصر في فئتك (class) باستخدام تدوين الأقواس المربعة الشبيه بالمصفوفات. بدلاً من استدعاء طريقة (method) مثل collection.GetItem(0)، يمكنك كتابة collection[0] الأكثر بديهية.

تُعرّف المفهرس باستخدام الكلمة الأساسية this مع الأقواس المربعة:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

الآن يمكنك الوصول إلى الكلمات بشكل طبيعي:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // مرحباً
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

المفهرسات ليست مقتصرة على الأعداد الصحيحة. يمكنك استخدام أي نوع كمعامل للفهرس، مما يجعلها مفيدة للوصول الشبيه بالقواميس:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

مثل الخصائص، يمكن أن تكون المفهرسات (indexers) للقراءة فقط (عن طريق حذف الـ setter) أو تتضمن منطق التحقق من الصحة في أدوات الوصول (accessors) الخاصة بها. إنها مثالية عندما يغلف الـ class الخاص بك مجموعة أو عندما يجعل تدوين الأقواس (bracket notation) الكود أكثر سهولة في القراءة.

challenge icon

التحدي

سهل

لنقم ببناء فئة Playlist تتيح لك الوصول إلى الأغاني باستخدام تدوين الأقواس البديهي، تماماً مثل التعامل مع مصفوفة. ستقوم بإنشاء قائمة تشغيل موسيقى حيث يمكن استرداد الأغاني وتحديثها حسب موقعها باستخدام مفهرس (indexer).

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Playlist.cs: قم بإنشاء فئة Playlist داخل مساحة الأسماء Music والتي تغلف مجموعة داخلية من الأغاني وتوفر وصولاً يشبه المصفوفة من خلال مفهرس. يجب أن تحتوي قائمة التشغيل الخاصة بك على:
    • مصفوفة سلاسل نصية (string array) خاصة لتخزين عناوين الأغاني
    • مشد (constructor) يقبل سلسلة نصية مفصولة بفاصلة لعناوين الأغاني ويقوم بتقسيمها إلى المصفوفة الداخلية
    • مفهرس باستخدام this[int index] يسمح بكل من جلب (get) وتعيين (set) الأغاني في موقع محدد
    • خاصية للقراءة فقط Count تعيد عدد الأغاني في قائمة التشغيل
    • طريقة GetAllSongs() تعيد جميع الأغاني مدمجة بواسطة " | "
  • Program.cs: في ملفك الرئيسي، قم بإنشاء قائمة تشغيل من المدخلات، ثم استخدم المفهرس للوصول إلى الأغاني وتعديلها. قم بتوضيح كل من قراءة الأغاني حسب الفهرس وتحديث أغنية في موقع محدد.

ستتلقى ثلاثة مدخلات:

  • قائمة عناوين أغاني مفصولة بفاصلة (على سبيل المثال، Song A,Song B,Song C)
  • فهرس لاسترداده (عدد صحيح)
  • عنوان أغنية جديد لاستبدال الأغنية الموجودة في نفس ذلك الفهرس

اطبع المخرجات بهذا التنسيق:

Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}

على سبيل المثال، إذا كانت المدخلات هي Rock Anthem,Jazz Vibes,Pop Hit، و 1، و Blues Classic، فيجب أن تكون المخرجات:

Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hit

لاحظ كيف يتيح لك المفهرس الوصول إلى playlist[1] للحصول على "Jazz Vibes" ثم تعيين playlist[1] = "Blues Classic" لتحديثها - وهذا أكثر طبيعية بكثير من استدعاء طرق مثل GetSongAt(1) أو SetSongAt(1, "Blues Classic")!

ورقة مرجعية

تسمح لك المفهرسات (Indexers) بالوصول إلى العناصر في فئتك (class) باستخدام تدوين الأقواس الشبيه بالمصفوفات (collection[0]) بدلاً من استدعاءات الدوال.

قم بتعريف مفهرس باستخدام الكلمة المفتاحية this مع الأقواس المربعة:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

مثال على الاستخدام:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

يمكن للمفهرسات استخدام أي نوع كمعامل للفهرس، وليس فقط الأعداد الصحيحة:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

مثل الخصائص (properties)، يمكن أن تكون المفهرسات للقراءة فقط (عن طريق حذف الـ setter) أو تتضمن منطق تحقق في أدوات الوصول الخاصة بها (accessors).

جرّب بنفسك

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // قراءة المدخلات
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO: إنشاء كائن `Playlist` من `songList`

        // TODO: طباعة العدد الإجمالي للأغاني باستخدام الخاصية `Count`

        // TODO: طباعة الأغنية عند الفهرس المعطى باستخدام الـ indexer

        // TODO: تحديث الأغنية عند الفهرس المعطى باستخدام الـ indexer

        // TODO: طباعة جميع الأغاني بعد التحديث باستخدام `GetAllSongs()`
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming