Menu
Coddy logo textTech

אינדקסרים (this[])

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 37 מתוך 70.

מאפשרי אינדקס מאפשרים לך לגשת לאיברים במחלקה שלך באמצעות סימון סוגריים הדומה למערך. במקום לקרוא למתודה כמו 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]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

אינדקסים אינם מוגבלים למספרים שלמים. אפשר להשתמש בכל טיפוס כפרמטר אינדקס, מה שהופך אותם לשימושיים לגישה דמוית מילון:

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

בדומה למאפיינים, אינדקסרים יכולים להיות לקריאה בלבד (על ידי השמטת ה־setter) או לכלול לוגיקת אימות במאפייני הגישה שלהם. הם אידיאליים כשהמחלקה שלך עוטפת אוסף או כשסימון בסוגריים מרובעים הופך את הקוד לקריא יותר.

challenge icon

אתגר

קל

בואו נבנה מחלקה בשם Playlist שמאפשרת לגשת לשירים באמצעות סימון סוגריים מרובעים אינטואיטיבי, ממש כמו בעבודה עם מערך. תיצרו רשימת השמעה של מוזיקה שבה אפשר לקבל ולעדכן שירים לפי מיקומם באמצעות אינדקסר.

תארגנו את הקוד בשני קבצים:

  • Playlist.cs: צרו מחלקה בשם Playlist במרחב השמות Music, שעוטפת אוסף פנימי של שירים ומספקת גישה דמוית מערך באמצעות אינדקסר. רשימת ההשמעה שלכם צריכה לכלול:
    • מערך מחרוזות פרטי לאחסון שמות השירים
    • בנאי שמקבל מחרוזת של שמות שירים המופרדים בפסיקים ומפצל אותה למערך הפנימי
    • אינדקסר המשתמש ב־this[int index] ומאפשר גם לקבל וגם להגדיר שירים במיקום מסוים
    • מאפיין לקריאה בלבד 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")!

נסו בעצמכם

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: הדפיסו את השיר במיקום הנתון באמצעות האינדקסר

        // TODO: עדכנו את השיר במיקום הנתון באמצעות האינדקסר

        // TODO: הדפיסו את כל השירים לאחר העדכון באמצעות GetAllSongs()
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C# אונליין