# מערך שיעור: LINQ חלק ב' — GroupBy, FirstOrDefault📋 מערך מרצה

משך: 2 שעות אקדמיות (90 דקות).

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

בסוף השיעור הסטודנטים צריכים: להשתמש ב-GroupBy עם foreach מקונן, להעדיף FirstOrDefault על First כשההתאמה לא מובטחת, ולשלב GroupBy+Count/Average לסטטיסטיקות.

דגש קריטי: זהו השיעור האחרון לפני הפרויקט המסכם (Naive Bayes) — הדגישו במפורש ש-GroupBy הוא בדיוק הכלי שישמש לספירת תדירויות שם.

---

## מהלך השיעור

| חלק בשיעור | משך | הערות ודגשים |
| --- | --- | --- |
| פתיחה וחיבור | 5 דקות | שאלו: "כמה תלמידים בכל מחלקה? Where/Select לבד עוזרים?" |
| הרעיון: GroupBy | 20 דקות | קיבוץ + foreach מקונן, הדגישו .Key |
| הבעיה: First קורס | 10 דקות | הדגימו InvalidOperationException על חיפוש לא-קיים |
| הרעיון: FirstOrDefault | 15 דקות | אותו חיפוש, בטוח |
| שילוב GroupBy+Count/Average | 15 דקות | סטטיסטיקות לפי קבוצה |
| קישור לפרויקט Naive Bayes | 10 דקות | הסבירו איך GroupBy ישמש לספירת תדירויות מילים |
| תרגול מודרך | 15 דקות | תרגיל 1+2 |

---

## דגשים להעברת השיעור

- זהו שיעור-הכנה ישיר לפרויקט המסכם — קשרו במפורש: "מחר תבנו מסווג שסופר כמה פעמים כל מילה מופיעה בכל קטגוריה — זה בדיוק GroupBy+Count שעשיתם היום".
- `foreach` מקונן על תוצאת `GroupBy` הוא נקודת הבלבול העיקרית — תנו לזה זמן, הדגימו שלב-שלב מה `group` ו-`group.Key` מייצגים.
- הדגמת הקריסה של `First` (InvalidOperationException בשידור חי) משכנעת יותר מכל הסבר על "למה FirstOrDefault עדיף".

---

## מושגים

**`GroupBy`** — קיבוץ איברים לפי מפתח, מחזיר קבוצות עם `.Key`.
**`First`** — מחזיר איבר ראשון תואם; זורק חריגה אם אין.
**`FirstOrDefault`** — כמו First, בטוח — מחזיר null/ברירת מחדל.

---

## תרגיל חשיבה

**שאלת פתיחה:** "אתם בונים מסווג ספאם שסופר כמה פעמים המילה 'חינם' מופיעה במיילים 'ספאם' לעומת מיילים 'תקינים'. איזה כלי מה-LINQ שלמדתם היום הכי מתאים לזה, ולמה?"

**מהלך:** הובילו את הסטודנטים לזהות ש-`GroupBy` (לפי סיווג המייל: ספאם/תקין) בשילוב עם ספירה (`Count`) בתוך כל קבוצה הוא בדיוק המנגנון הדרוש. זו הכנה ישירה ומכוונת לפרויקט Naive Bayes שמגיע מיד אחרי.

**מה המרצה מראה בסוף:** הריצו דוגמה זעירה — רשימת מילים עם תיוג ("spam"/"ham"), `GroupBy` לפי התיוג, וספירה של מופעי מילה ספציפית בתוך כל קבוצה עם `Count(w => w == "free")`. זו בדיוק הלבנה הראשונה של הפרויקט המסכם שמגיע מיד בשיעור הבא.
