القواميس في C#: لماذا هي مهمة وكيفية العمل معها؟
\n\nتخيل أنك أمين مكتبة. لديك آلاف الكتب، وتحتاج إلى العثور على كتاب معين في ثانية. هل ستبدأ في مراجعة جميع الكتب واحدة تلو الأخرى؟ لا، ستستخدم فهرسًا. القاموس (Dictionary) في C# هو هذا الفهرس تمامًا. فهو يخزن أزواج "مفتاح-قيمة" ويسمح بالحصول الفوري على البيانات بواسطة المفتاح.
\n\nولكن ماذا تفعل عندما تحتاج ليس فقط إلى العثور على إدخال واحد، بل إلى معالجة جميع محتويات القاموس؟ على سبيل المثال، عرض جميع إعدادات التطبيق، أو حساب المجموع في سلة التسوق لمتجر إلكتروني، أو تحويل البيانات إلى JSON. هنا يطرح السؤال الكلاسيكي: "How to iterate over a dictionary?".
\n\nعلى Stack Overflow، حصل هذا السؤال على آلاف المشاهدات. وليس من دون سبب: قد يبدو الأمر بسيطًا؟ لكن المبتدئين غالبًا ما يتعثرون في أنواع البيانات، بينما يهتم المحترفون بالأداء. في هذه المقالة، سنشرح جميع طرق التكرار على القاموس في C#: من foreach البسيط إلى LINQ المتقدم. هيا بنا!
1. الأساسيات: هيكل Dictionary في C#
\n\nقبل أن نبدأ بالتكرار، دعنا نتذكر كيف يبدو قاموس C#. إنها مجموعة عامة من مساحة الأسماء System.Collections.Generic.
Dictionary<string, int> ages = new Dictionary<string, int>()\n{\n { "Анна", 25 },\n { "Борис", 30 },\n { "Виктор", 35 }\n};\n\nكل عنصر في القاموس هو هيكل KeyValuePair<TKey, TValue>. له خاصيتان: Key و Value. مع هذا الزوج سنعمل أثناء الاجتياز.
2. الطريقة الكلاسيكية: foreach على القاموس
\n\nالطريقة الأكثر شيوعًا للتكرار على القاموس في C# هي حلقة foreach. إنها موجزة وقابلة للقراءة وآمنة.
foreach (KeyValuePair<string, int> kvp in ages)\n{\n Console.WriteLine($"{kvp.Key}: {kvp.Value} سنة");\n}\n\nالإخراج:
\nАнна: 25 سنة\nБорис: 30 سنة\nВиктор: 35 سنة\n\nلاحظ: kvp هو KeyValuePair. لا تحاول تغيير المفتاح أو القيمة داخل الحلقة - سيصبح القاموس غير متناسق وستحصل على استثناء InvalidOperationException.
نصيحة من المحترفين: إذا كنت لا تريد كتابة النوع الكامل، استخدم var:
foreach (var kvp in ages) { ... }\n\n3. المفاتيح فقط أو القيم فقط
\n\nأحيانًا لا نحتاج إلى الزوج بأكمله. على سبيل المثال، نحتاج فقط إلى عرض قائمة بجميع المفاتيح (الأسماء) أو جميع القيم (الأعمار). لهذا، يحتوي القاموس على الخاصيتين Keys و Values.
التكرار على المفاتيح
\nforeach (string name in ages.Keys)\n{\n Console.WriteLine($"الاسم: {name}");\n}\n\nالتكرار على القيم
\nforeach (int age in ages.Values)\n{\n Console.WriteLine($"العمر: {age}");\n}\n\nهذا أسرع من الحصول على KeyValuePair إذا كنت لا تحتاج إلى الجزء الثاني. كما أن الكود يصبح أنظف.
4. الوصول بالفهرس: for و ElementAt
\n\nيحاول العديد من المبتدئين استخدام for (int i = 0; i < dict.Count; i++). لكن Dictionary في C# لا يدعم المفهرس بالرقم! محاولة كتابة dict[i] ستؤدي إلى خطأ في الترجمة.
ولكن يمكن التحايل: الحصول على مجموعة الأزواج عبر .ToList() والوصول إليها بالفهرس.
var list = ages.ToList();\nfor (int i = 0; i < list.Count; i++)\n{\n Console.WriteLine($"{list[i].Key}: {list[i].Value}");\n}\n\nالعيوب:
\n- \n
- يتم إنشاء نسخة إضافية من البيانات (ذاكرة + وقت). \n
- يتم فقدان معنى القاموس كمصفوفة ترابطية. \n
يجب استخدام هذه الطريقة فقط إذا كنت بحاجة ماسة إلى فهرس (على سبيل المثال، للمعالجة المتوازية مع التقسيم إلى أجزاء).
\n\n