
foreach, שרצה על אוספים (collections) כמו מערך, בלי לעבוד עם אינדקסים.foreach, אחריו טיפוס ושם למשתנה, המילה in והאוסף. לדוגמה foreach (int item in numbers). שם המשתנה מוכר רק בתוך הלולאה.item מקבל בכל פעם את האיבר הבא של המערך, לפי הסדר, בלי צורך במספר אינדקס.sum לאפס, ובכל איטרציה מוסיפים אליו את item. בדוגמה הסכום של המערך הוא 29.for מתאימה כשצריך את האינדקס או לשנות את התאים. לולאת foreach נוחה יותר להצגה של כל האיברים או לחישוב עליהם.item כאינדקס, למשל numbers[item]: item הוא הערך עצמו ולא המיקום, ולכן הוא עלול להצביע על תא שלא קיים, והתוכנית קורסת.item הוא לקריאה בלבד, והקומפיילר מציג את השגיאה "cannot assign to item because it is a foreach iteration variable".foreach רץ רק על אוספים. משתנה בודד מסוג int אינו אוסף, ולכן הוא לא עובד בלולאה כזו.foreach מתאימה לקריאה והצגה של אוסף או לחישוב עליו, ואילו for נדרשת כשצריך לשנות את התאים.הטקסט המלא של הדקות הראשונות בהרצאה «לולאת foreach» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שראינו מה זה מערכים אנחנו סוף סוף יכולים להגיע ללולאה האחרונה שקיימת ב-C-Sharp וזאת לולאת for each. שאר הלולאות שראינו היו לולאת while, לולאת do while, לולאת for ואמרנו שקיימת עוד לולאה רביעית שנקראת לולאת for each והיא רצה על משהו שנקרא collections או אוספים.
אוסף זה בעצם תא בזיכרון שיש לו המון תאים בתוכו בדיוק כמו מערך. אז לולאת for each מאפשרת לנו לרוץ על collections. בואו קודם כל נגדיר פה מערך.
ניקח מערך אינטג'רי, נקרא לו Numbers ונתחיל אותו בסדרה של מספרים קבועים. אנחנו רוצים לרוץ ובואו נניח להציג את כל הערכים במערך.
אז כמובן שאנחנו יכולים לרוץ בלולאת for רגילה. for int i שווה 0 כל עוד i יותר קטן מ-numbers.length i++ ואנחנו יכולים להציג את Numbers על i.
ואז אנחנו בעצם הולכים לראות את כל אחד מהתאים במערך. בואו נריץ את זה ונראה את כל המספרים במערך. אחלה.
אבל אם אנחנו רוצים לרוץ על מערך ורק לבצע איזושהי פעולה של קריאת המידע שלו, אז עובדת for יכול להיות שהיא טיפה מורכבת בשביל הסיפור הזה. למרות שהיא לא ממש מורכבת, אבל יש פה ריצה לפי אינדקס, קנייה לתא במערך לפי האינדקס.
לצורך כך בנו לולאה נוספת. הלולאה הזאת נקראת forage. forage אומרת דבר כזה: דבר ראשון תביאו לי את הטיפוס של כל אחד מהתאים במערך.
הטיפוס של כל אחד מהתאים במערך הזה הוא in. לאחר מכן תמציאו שם של משתנה שהמשתנה הזה יהיה תקף רק למשך הלולאה הנוכחית. בואו נמציא משתנה אייטם. לאחר מכן תרשמו את המילה in ולאחר מכן את אותו קולקשן שאתם רוצים לרוץ עליו.
בואו נפתח סוגריים, נסגור, ובתוך אנחנו יכולים לבצע את פקודות הלולאה. מה הלולאה אומרת? לולאת for each אומרת דבר כזה, שם המשתנה שיצרנו בתוך הלולאה שהמצאנו הופך להיות כל אחד מפריטי האוסף.
זאת אומרת שבאיטרציה הראשונה של הלולאה האייטם הזה יהיה 7, כלומר זה משתנה שיחזיק 7. באיטרציה השנייה האייטם יהיה 3, באיתרציה השלישית האייטם יהיה 5. לאחר מכן האייטם יחזיק 10. לאחר מכן הוא יחזיק מינוס 4. לבסוף הוא יחזיק 6 ופה תסתיים הלולה.
זאת אומרת שאם אנחנו רק מדפיסים את אייטם אנחנו כבר הולכים לקבל את כל הערכים. פה אנחנו צריכים כמובן להדפיס איזשהו רווח בין אחד לשני. בואו נריב שוב.
ונקבל את כל הערכים מודפסים בדיוק כמו ההלולה הקודמת. אבל לא עבדנו פה עם אינדקסים ואייטם זה לא אינדקס כמו ה-i שהיה פה לכן טעות מפוצה שתלמידים מתחילים מוצאים זה פשוט קוראים ל-item i ואז חושבים שיש להם פה אינדקס ולכן מנסים לפנות אליו על ידי numbers במיקום i
וזאת כמובן שגיאה מאוד קריטית מפני שבפעם הראשונה שעלולה הזאת תנסה לרוץ i הוא 7 האם יש לנו תא במיקום 7? התא הראשון הוא 0 לאחר מכן 1, 2, 3, ארבע וחמש אין לנו בכלל תא במיקום שבע ולכן על הפעם הראשונה העלולה הזאת הולכת לקרוס אנחנו הולכים לקבל
קריסה שימו לב שמופיעה לנו ההודעה הזאת ואם אנחנו מסתכלים אנחנו רואים שהתוכנית לא ביצעה שום דבר אז אם לדוגמה היה לנו פה שתיים כאן כן היינו רואים איזה משהו כאן היינו רואים את המספר שלוש על ההתחלה ואז התוכנית הייתה בעצם קורסת בואו נריץ נראה שלוש על ההתחלה ואז קריסה למה שלוש מפני ששתיים זה הפריט
הראשון האיי זה לא האינדקס אלא הפריט עצמו וזה אומר שתיים numbers במיקום שתיים שווה למספר שלוש מפני שמערך מתחיל באפס אחר כך אחד אחר כך שתיים אז numbers במיקום שתיים זה שלוש אז לא לעשות את הטעות הזאת ולא לקרוא למשתנה הזה איי או אינדקס אלא אייטם או number או אותו פריט שאנחנו רוצים ואז אנחנו גם לא נתבלבל ונגיע לאייטם עצמו
את הפריט עצמו. עכשיו הלולה הזאת היא בסדר גמור ואנחנו מציגים את הפריטים עצמם. אילוץ נוסף שקיים בלולאת