On this page
מערך שיעור: LINQ חלק א' — Where, Select, OrderBy
משך: 2 שעות אקדמיות (90 דקות).
מטרת השיעור: הסטודנטים יבינו Lambda Expressions ויחליפו לולאות foreach ידניות ב-Where/Select/OrderBy.
בסוף השיעור הסטודנטים צריכים: לכתוב Lambda בסיסית, לסנן ולמפות אוסף עם LINQ, ולהסביר למה LINQ לא משנה את האוסף המקורי.
דגש קריטי: התחילו תמיד מהגרסה הידנית (foreach+if+רשימה חדשה) לפני LINQ — הניגוד הישיר הוא מה שמצדיק את התחביר החדש.
מהלך השיעור
| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| פתיחה וחיבור | 5 דקות | הראו סינון ידני עם foreach+if — “5 שורות לדבר פשוט” |
| הרעיון: Lambda | 15 דקות | s => s.Age >= 18 — הסבירו כפונקציה אנונימית |
| הרעיון: Where | 15 דקות | אותו סינון, שורה אחת |
| הרעיון: Select | 15 דקות | מיפוי, הדגישו שינוי טיפוס אפשרי |
| שרשור Where+Select | 10 דקות | דוגמה משולבת |
| OrderBy + “לא משנה מקור” | 15 דקות | קריטי להדגים ש-students נשאר לא-ממוין |
| תרגול מודרך | 15 דקות | תרגיל 1+2 |
דגשים להעברת השיעור
- Lambda היא נקודת החיכוך התחבירית העיקרית של השיעור — תנו לה זמן משלה, אל תמהרו ישר ל-Where.
- ההדגמה ש-
OrderByלא משנה את המקור (בניגוד ל-.Sort()שכבר מוכר) היא קריטית — בלבול נפוץ מאוד, שווה זמן נפרד ולא רק הערת אגב. - אם יש זמן, שווה להראות
.ToList()ולהסביר בקצרה ש-LINQ “עצל” (Deferred Execution) — לא להעמיק, רק לתת אינטואיציה שהחישוב בפועל קורה רק כשצריך את התוצאה.
מושגים
LINQ — מתודות מובנות על אוספים לסינון/מיפוי/מיון.
Lambda Expression — פונקציה אנונימית קצרה (s => expr).
Where — סינון.
Select — מיפוי/טרנספורמציה.
OrderBy/OrderByDescending — מיון, מחזיר עותק חדש.
תרגיל חשיבה
שאלת פתיחה: “אם OrderBy היה משנה את הרשימה המקורית (כמו .Sort()), אילו באגים אפשריים היו נוצרים בקוד שמניח שסדר הרשימה לא משתנה?”
מהלך: תנו לסטודנטים לחשוב על תרחיש — קוד במקום אחר בתוכנית שמסתמך על הסדר המקורי (למשל אינדקס ספציפי) היה נשבר בשקט אחרי קריאה ל-OrderBy במקום אחר לגמרי בקוד. הובילו לתובנה: LINQ “בטוח” בדיוק כי הוא לעולם לא משנה קלט קיים — עקרון שמזכיר את ה-Value מול Reference שנלמד קודם, רק ברמת אוספים.
מה המרצה מראה בסוף: הריצו students.OrderBy(s => s.Age) ומיד אחר כך הדפיסו את students המקורית — הראו שהיא עדיין בסדר המקורי, לא הממוין. לצד זאת, הריצו students.Sort() (מ-IComparable, מהיחידה הקודמת) והראו שהפעם students עצמה כן השתנתה — ניגוד ישיר בין שתי הגישות.