PracticU

Generics - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מתקדם - #Advanced .NET C › Generics - חלק 2
מילון מושגים:
.NET - פלטפורמת פיתוח של מיקרוסופט להרצת יישומים בשפות כמו C#, הכוללת ספריות וסביבת ריצה משותפות.
ArrayList - מבנה נתונים של רשימה דינמית שגודלה משתנה, הנפוץ בשפות כמו Java ו-C#.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
אינדקס - מבנה במסד נתונים שמאיץ חיפוש ושליפה. גם מספר המציין מיקום של איבר במערך.
Dictionary - מבנה נתונים שמאחסן זוגות של מפתח וערך, ומאפשר שליפה מהירה של ערך לפי מפתחו.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.

Generics - חלק 2
בשיעור הזה עוברים על אוספי הג'נריקס הנפוצים של .NET ומשווים כל אחד מהם לחלופה הישנה שלו, כדי לדעת איזה אוסף לבחור לפי הצורך.
השלבים העיקריים
1. List במקום ArrayList: List<T> עושה את אותן פעולות כמו ArrayList, אבל הטיפוס נקבע מראש. לכן אין קאסטים ואין בוקסינג ואנבוקסינג, ו-List<int> מקבל רק מספרים שלמים.
2. קיבולת התחלתית: בלי הגדרה, הקיבולת מתחילה מ-0 וגדלה ל-4, אחר כך ל-8 ול-16, וכל גידול מעתיק את המערך הקודם. הגדרת קיבולת מראש חוסכת העתקות כשטוענים כמות גדולה של פריטים.
3. פעולות על List: Clear מנקה את האוסף, גישה לפי אינדקס מחזירה את הערך במיקום, ו-RemoveRange מוחק טווח לפי מיקום ואורך.
4. Stack: מחסנית שבה הפריט האחרון שנכנס יוצא ראשון. Push מכניס, Pop מוציא את העליון ו-Peek מציץ בו בלי להוציא.
5. Queue: תור שבו הפריט הראשון שנכנס יוצא ראשון. Enqueue מכניס לסוף ו-Dequeue מוציא מההתחלה. Queue<double> דוחה כל טיפוס אחר.
6. Dictionary: זוגות של מפתח וערך. המפתח חייב להיות ייחודי, והכנסת מפתח קיים גורמת לקריסה, לכן כדאי לבדוק עם ContainsKey לפני ההכנסה. ContainsValue בודק ערך, ו-Remove מוחק לפי מפתח.
7. סדר ההכנסה: Dictionary לא ממיין, והפריטים יכולים להופיע בסדר אחר מהסדר שבו הוכנסו. אסור להניח סדר קבוע.
8. SortedDictionary ו-SortedList: שניהם שומרים זוגות מפתח וערך וממיינים לפי המפתח. SortedList חוסכת זיכרון ומאפשרת גישה לפי אינדקס. SortedDictionary מבזבזת יותר זיכרון, אבל מהירה יותר כשמכניסים או מסירים פריטים.
9. LinkedList: רשימה מקושרת דו-כיוונית. כל פריט מצביע על הקודם והבא, והפריטים לא חייבים להיות רצופים בזיכרון. הכנסה ומחיקה מהירות, אבל אין גישה לפי אינדקס.
10. HashSet ו-SortedSet: קבוצה שלא מאפשרת כפילויות. Add מחזיר true אם הפריט נוסף ו-false אם הוא כבר קיים. SortedSet שומר על סדר ממוין תוך כדי ההכנסה.
בסיום השיעור ברור שהבחירה נקבעת לפי הצורך: סדר, מפתח, ייחודיות, מיון או גישה לפי מיקום.
השיעור הבא בקורס: Generics - חלק 3

פרקי ההרצאה: Generics - חלק 2

  1. 00:00

    קולקשנים גנריים: רשימה List של T

  2. 01:08

    בעיות ArrayList ללא ג'נריקס

  3. 02:38

    קיבולת התחלתית של List

  4. 04:38

    ניקוי, מיון וגישה לפי אינדקס

  5. 06:21

    העברת קוד הבדיקה לפונקציה נפרדת

  6. 07:02

    מחסנית Stack של מספרים

  7. 09:25

    תור Queue של מספרים עשרוניים

  8. 12:34

    מילון Dictionary של מפתח וערך

תמלול ההרצאה: Generics - חלק 2

הטקסט המלא של הדקות הראשונות בהרצאה «Generics - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

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

  2. 00:33

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

  3. 01:06

    List אומרת בדיוק את אותו הדבר, אבל בגלל שהיא בנויה כג'נריק זה הרבה יותר נכון להשתמש, בגלל שה-ArrayList אוספת Objects. ופה אנחנו נכנסים לארבעת החסרונות של אובייקטס.

  4. 01:22

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

  5. 01:58

    נניח עשרה ערכים items.ad i כפול i זה כמובן אינטג'ר אנחנו יכולים להשתמש ב-foreach ולהציב את האייטם בואו נריץ והכל עובד כמו שצריך הקונסטרקטור מאפשר לנו להכניס גם קפסיטי וקפסיטי בעצם מגדיר כמה הגודל ההתחלתי של המערך החד-מימדי שנפתח בתוך הליסט.

  6. 02:47

    אם לדוגמה היינו מציגים כאן items.capacity היינו רואים שבהתחלה ה-capacity היה שווה ל-0 מפני שאין לנו בכלל פריטים בתוכו. אחרי שהכנסנו פריט ראשון אנחנו יכולים לראות מה ה-capacity.

  7. 03:08

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

  8. 03:44

    כאשר ה-4 התמלאה 4 פעמים ה-capacity הופך ל-8 ואז ה-8 מתמלא, יש לנו פה סך הכל 8, זה הופך ל-16 וכולי. עכשיו, מה קורה?

  9. 03:55

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

  10. 04:15

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

  11. 04:37

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

  12. 05:07

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

  13. 05:58

    אנחנו יכולים לגשת ל-items, רימוב ורימוב אול ורימוב את, רימוב אול מקבלת קולקשן שאנחנו יכולים לשלוח, רימוב ריינג' מאיפה למחוק עד איפה, ובצורה כזאת אנחנו יכולים לשלוט על האוסף שלנו ולעשות איתו בעצם מה שאנחנו רוצים כקולקשן, כולל לולאת forEach.

  14. 06:28

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

  15. 06:58

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

  16. 07:25

    בואו נכניס 100, נכניס 200, 300 ו-400 וכעת אם אנחנו רוצים לבצע הוצאה של פריט, פופ מוציאה לנו פריט, והיא כמובן תוציא את הפריט האחרון שנכנס ואנחנו רואים את ה-400.

  17. 07:47

    אנחנו יכולים להשתמש גם בפיק בכדי להציץ על פריט מבלי להוציא אותו. אם נבצע עוד פעם הוצאה כמובן שהוא הציא את ה-300 כי ה-400 כבר יצא. אין לנו שום בעיה לרוץ ב-foreach ולהציג את כל הפריטים כמובן הנותרים שנשארו לנו.

  18. 08:26

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

  19. 08:47

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

  20. 09:19

    זה היתרון הגדול כמובן של הקונספט של ג'נריות. אז כמו שיש לנו סטאק יש לנו את החבר של סטאק והחבר של סטאק אם אתם זוכרים נכון היה q מחסנית ותור בואו נסתכל על הq גם הוא ג'נריק בואו ניקח q של דאבל כרגע, פונקציית enq כלומר enter to the q אומרת לנו תביאו לי רק פריטים שהם דאבל.

  21. 10:04

    בואו נביא 3.4 items 5.6 וכעת אנחנו באים ואומרים אנחנו רוצים to pick על items.pick מה שהוא יגיד לנו זה שהפריט הבא שהולך לצאת הוא יהיה 1.2 מפני שtour מוציא את הראשון שנכנס.

  22. 10:31

    tack זה last in, first out, לפה ו-Q זה first in, first out, פיפו.

  23. 10:51

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

  24. 11:00

    נראה פה שורה ונוציא את הפריט. Items.DeleteFromQ וכעת אנחנו רואים ש-DQ מחזירה לנו דאבל והיא כמובן מוציאה את הפריט. אנחנו נראה כמובן 1.2 אבל הפריט עף מה-Q אנחנו לא נראה אותו יותר אם נבצע עוד פעם Delete From Q אנחנו נראה שאנחנו מוציאים את 3.4 כי הוא הפריט הבא בתור שנמצא שם.

  25. 11:32

    גם כאן אנחנו יכולים לבצע for each ולרוץ על כל הפריטיים בדיוק כמו שהיה לנו בקונספט של הג'נריקס. לצורך הדוגמה בואו נוסיף עוד פריט אחד 7.8 ונראה שמה שנשאר לנו בתוך התור זה 5.6 ו-7.8.

  26. 12:00

    בואו נריץ ומה שנשאר 5.6 ו-7.8. אז בייסיקלי אנחנו יכולים גם להשתמש בתור עם קונספט של ג'נריקס וזה יהיה הרבה יותר עדיף מאשר לקחת תור בלי ג'נריק, כמו שהיה לנו בעולם הקולקשנים שלמדנו פעם, פשוט ג'נריק מייעל ומשדרג את כל העסק הזה.

  27. 12:24

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

  28. 12:50

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

  29. 13:14

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

  30. 13:36

    עכשיו פונקציית add אומרת תביאו לי מפתח אבל המפתח חייב להיות אינטג'ר כי זה מה שהגדרנו בג'נריק. תביאו לי value, הvalue חייב להיות סטרינג.

  31. 13:46

    אז בואו נגדיר 100 ואת המחרוזת aaa, ניקח 200, 300 ו-400 בתור מפתחות ומחרוזות בכדי לראות מה בדיוק נכנס. אם אנחנו רוצים עכשיו להשיג פריט אנחנו צריכים בעזרת הסוגריים המרובעים לתת את המפתח שלו לדוגמה 300. כרגע הוא יציג לנו c c c כי זה הפריט שיושב ב-300.

לקורס המלא: קורס תכנות מתקדם ב‑#C ודוט-נט

ההרצאה הקודמת: Generics - חלק 1

ההרצאה הבאה: Generics - חלק 3

הרצאות קשורות מקורסים אחרים

  • Generics

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס WCF - תקשורת למתקדמים בדוט-נט