316. Multidimensional jagged array

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

למשל, נניח שיש לנו מתודה נחמדה כזאת:

1
2
3
public static void MyMethod<T>(T[,] value)
{
}

אפשר לקרוא לה ככה:

1
MyMethod(new int[,] {});

היינו מצפים שגם יתקיים שאפשר לקרוא לה כך:

1
MyMethod(new int[][,] {});

למה בעצם? כי יש לנו מערך דו מימדי של מערכים חד מימדיים. הלא כך?

מסתבר שהקוד הנ"ל לא מתקמפל. באופן מפתיע הקוד הבא דווקא כן מתקמפל:

1
MyMethod(new int[,][] {});

מה בעצם קורה כאן? יכול להיות שזה נראה ממש מוזר, אבל בואו ננסה לאתחל מערך כזה:

1
int[,][] superMatrix = new[,] {{new[]{1}}};

כאמור, זה מערך דו מימדי של מערכים חד מימדיים. כלומר, מטריצה של מערכים חד-מימדיים. איך היינו מצפים לגשת אליה?

ככה:

1
2
superMatrix[0, 0][0] = 2;
Console.WriteLine(superMatrix[0, 0][0]);

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


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

אבל כשכותבים רכיבים גנריים מסוימים, לפעמים נתקלים בטיפוסים מוזרים כאלה.

המשך יום תכלת טוב.

שתף