מערכים ב-C#

מערכים מאפשרים לאחסן ביחידה אחת מספר יחידות מידע מאותו הסוג.

תגדרת מערך תהיה על ידי ציון סוג המערך, סוגריים [] לסימון מערך, אתחול מערך והגדרת גודל המערך.

// Init Array
int[] numbers = new int[3];
// Put values
numbers[0] = 2;
numbers[1] = 4;
numbers[2] = 20;
// Go over the array values with for
for(int i = 0; i < numbers.Length; i++){
    Console.WriteLine(numbers[i]);
}
// Go over the array with foreach
foreach(int num in numbers){
    Console.WriteLine(num);
}

Array sorting

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

int[] numbers = new int[] {1, 2, 3, 4, 5};
Array.Sort(numbers);

Array reversal

הפיכת הסדר של העצמים במערך.

Array.Reverse(numbers);

Array clearing

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

Array.Clear(numbers, 0, numbers.Length);

Array IndexOf

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

int position = Array.IndexOf(numbers, 5);

אפשר להוסיף לפונקציה גם אינדקס התחלתי וסופי לחיפוש אם לא רוצים לחפש בכל המערך.

Lists

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

נגדיר את הרשימה וניתן לה סוג. עכשיו אפשר להוסיף עצמים לרשימה ללא הגבלה.

// Declare a list
List<int> listNumbers = new List<int>();
// Adding items to the list
listNumbers.Add(1);
listNumbers.Add(2);

אפשר להוסיף עצמים לרשימה גם בזמן ההגדרה שלה.

List<int> listNumbers = new List<int>()
{
  1, 2, 3
};

כדי למצוא אורך של רשימה לא נשתמש ב-Length, כי אין לנו אורך קבוע, יש לנו רק את מספר העצמים שיש ברשימה כרגע. לכן נשתמש ב-Count.

for(int i = 0; i < listNumbers.Count; i++){
   Console.WriteLine(listNumbers[i]);
}

foreach(var item in listNumbers)
{
   Console.WriteLine(item);
}

יש עוד הרבה פונקציות שקשורות לרשימות, כמו הסרה מרשימה, חיפוש, מציאת אינדקס ועוד.

Dictionary

מבנה נוסף הוא Dictionary שמאחסן ערכים של key-value ללא סדר מסויים. ה-key חייבים להיות יחודיים ולא יכולים להכיל null. הערכים יכולים.

Dictionary<int, string> names = new Dictionary<int, string>();
names.Add(1, "Jack");
names.Add(2, "John");

// Init Dictionary on definition
Dictionary<int, string> names = new Dictionary<int, string>
{
    {1, "Jack"},
    {2, "John"}
};

אם יהיו שני מפתחות שווים, תהיה שגיאה של התוכנית בזמן ריצה.

מעבר על Dictionary עם קבלת הזוגות של הערכים.

for(int i = 0; i < names.Count; i++)
{
    Console.WriteLine(names.ElementAt(i));
}

קבלת גישה לכל חלק של הזוג בנפרד.

for (int i = 0; i < names.Count; i++) {
    KeyValuePair<int, string> pair = names.ElementAt(i);
    Console.WriteLine($"{pair.Key} - {pair.Value}");
}

foreach(KeyValuePair<int, string> item in names) {
    Console.WriteLine($"{item.Key} - {item.Value}");
}

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

if(names.TryGetValue(1, out string name))
{
    Console.WriteLine(name);
}

// Direct access
Console.WriteLine(names[1]);

שינוי ערך ב-Dictionary והסרת ערך.

names[1] = "Abby";
names.Remove(1);

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

אפשר לבדוק אם הערך קיים על ידי הפונקציה ContainsKey.