# מערך שיעור: 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` עצמה כן השתנתה — ניגוד ישיר בין שתי הגישות.
