الدرس 10 من 10

القواميس و LINQ

هدف الدرس

عُدّ بـ Dictionary واسأل بـ LINQ

01

الشرح

Dictionary<string, int> يربط مفتاحًا بقيمة: var gold = new Dictionary<string, int>(); ثم gold["ليان"] = 50; تضيف المفتاح أو تستبدل قيمته. لكن قراءة مفتاح غائب ترمي KeyNotFoundException، ولذلك تنهار gold["سارة"]++ في أول مرّة. اسأل أوّلًا بـ ContainsKey، أو استعمل TryGetValue(key, out int value): تُرجع هل وُجد المفتاح، وتضع قيمته في value أو صفرًا، وهو نمط Try نفسه من درس الدوال.

وLINQ من System.Linq أسئلة جاهزة على أي مجموعة، تأخذ دالة قصيرة بسهم: Where(x => x > 10) تُبقي ما صحّ له الشرط، وSelect(x => x * 2) تحوّل كل عنصر، وOrderBy ترتّب تصاعديًّا وOrderByDescending تنازليًّا، وSum() تجمع، وCount(x => ...) تعدّ ما صحّ له الشرط. وتتسلسل: scores.Where(s => s >= 50).OrderBy(s => s).ToList().

والقاموس مجموعة أزواج، لكلٍّ منها Key وValue، فتعمل عليه LINQ كما تعمل على القائمة، وValues قيمه وحدها. والاستعلام مؤجَّل: لا يُنفَّذ حين تكتبه بل حين تمرّ على نتيجته، فإن تغيّرت المجموعة بينهما تغيّرت النتيجة. وToList() تنفّذه فورًا وتحفظ النتيجة قائمةً.

02

المطلوب

أكمل CountKills(kills) لتُرجع قاموسًا بعدد مرّات قتل كل نوع من الأعداء في السجلّ. وKillsOf(kills, name) تعدّ مرّات نوع واحد بـ Count. وTotalKills(counts) تجمع قيم القاموس بـ Sum. وReport(counts, min) تُرجع قائمة نصوص بالشكل "عفريت: 3" لكل نوع قُتل min مرّات فأكثر، من الأكثر إلى الأقلّ، بـ Where وOrderByDescending وSelect.

معايير التصحيح

5 معايير
  1. CountKills تعدّ كل نوع
  2. KillsOf تعدّ نوعًا واحدًا، وصفرًا لما لم يُقتل
  3. TotalKills تجمع قيم القاموس
  4. Report تُبقي من بلغ min وترتّب من الأكثر، بالشكل «عفريت: 5»
  5. CountKills ثم Report من سجلّ خام
Program.cs
المخرجاتC# · Mono 6.6 · Judge0

يُترجَم الكود ويعمل على السيرفر…

–/5

يُترجَم الكود ويعمل على السيرفر…

5 معايير في بطاقة «المطلوب».