וובמאסטר - תיכנות ובניית אתרים

מדריך #C מתקדם - אוספים גנריים - Generic Collections

ליאור זמיר ,‏ ג'ון ברייס הדרכה‏ ‏/‏ 15 פברואר, 2011
F+
F-

ב- Net. קיימים מספר אוספים הנמצאים ב- namespace הנקרא System.Collections. להלן דוגמא למספר אוספים נפוצים:

  • ArrayList – מייצג אוסף דינמי של פריטים.
  • Hashtable – מייצג אוסף של זוגות ערכים (key/value) הממויין לפי ה- hash code של ה- key.
  • SortedList – מייצג אוסף של זוגות ערכים (key/value) הממויין לפי הערך של ה- key.
  • Queue – מייצג אוסף של פריטים בתור (הראשון שנכנס לאוסף, הוא הראשון שייצא – FIFO).
  • Stack – מייצג אוסף של פריטים במחסנית (האחרון שנכנס לאוסף, הוא הראשון שייצא – LIFO).

לשימוש באוספים אלו שני חסרונות עיקריים:

  1. ביצועים – שימוש באוספים הנ"ל יכול לגרום לביצועים נמוכים כאשר אנו מכניסים לאוסף טיפוסים מסוג struct בשל הפעולות בזיכרון המתבצעות בזמן ריצה ע"י המנגנונים של Net. (בתהליך הנקרא boxing שבו מתייחסים ל- value-type כגון struct כ- reference type). כלומר, פגיעה במהירות זמן הריצה של התוכנית.
  2. המרות – האוספים הרגילים אינם סוגים בטוחים (Typed-Safe) מיכוון שהם עובדים עם מחלקת Object. זה אומנם מקנה להם את היכולת להכיל כל טיפוס אך מנגד יוצר בעיה שהאוסף יכול לקבל טיפוסים שאנחנו לא רוצים שיהיו בו. וכמובן שכל שליפה של פריטים מהאוסף תאלץ אותנו להשתמש בהמרות מיותרות. הפיתרון הנהוג היה ליצור מחלקות אוסף משלנו ולממש אותם לטיפוס מסויים - פיתרון שמצריך המון עבודה.

 

וכאן נכנס לתמונה השימוש ב- Generics (הקיים החל מגירסה 2 של .Net): שימוש באוספים גנריים.

לכל האוספים הקלאסיים המוזכרים לעייל יש גירסה גנרית שניתן להשתמש בה. האוספים נמצאים ב- namespace הנקרא System.Collections.Generic (מופיע כברירת מחדל ב- using בראש של כל קובץ C# החל מגירסה 2).

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

לדוגמא, על-מנת ליצור אוסף גנרי דינמי (המסוגל לגדול/לקטון בהתאם לצורך) המתנהג כמו האוסף הקלאסי ArrayList אך ללא החסרונות שציינו, ניתן להשתמש באוסף הגנרי <>List  :

List<int> numbers = new List<int>();

בדוגמא הנ"ל בחרנו לאסוף מספרים שלמים (int). כמובן שניתן לאסוף כל טיפוס נתונים שנרצה.

האוסף מכיל את כל הפונקציונליות הרלוונטית (הוספה/הסרת פריטים, פונקציות שירות כמו מיון וכו'):

List<int> numbers = new List<int>();

numbers.Add(500);
numbers.Add(-25);
numbers.Add(17);

numbers.Sort();

Console.WriteLine("The numbers (After a Sort):");
foreach (int n in numbers)
  Console.WriteLine(n);

Console.WriteLine("Count: {0} numbers", numbers.Count);

הפלט:

פלט - שימוש באוסף הגנרי - List

ליאור זמיר, ג'ון ברייס הדרכה

כיום אני ה- Webmaster של תוכנית החדשנות של HPE Software.
לפני כן, הייתי מנהל תחום Webmaster ומרצה בכיר בג'ון-ברייס (במשך 9 שנים) בקורסים לפיתוח ותיכנות באמצעות Microsoft .NET, מולטימדיה, בניית אתרי אינטרנט ואינטראנט. פיתוח הדרכה ומתן ייעוץ טכנולוגי.
תגיות: C#‏  /  Visual Studio‏  

תגובות בפייסבוק

תגובות למאמר



עוד במדריך

תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות