التكرار على القاموس في C#: دليل شامل للمبتدئين والمحترفين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

القواميس في C#: لماذا هي مهمة وكيفية العمل معها؟

\n\n

تخيل أنك أمين مكتبة. لديك آلاف الكتب، وتحتاج إلى العثور على كتاب معين في ثانية. هل ستبدأ في مراجعة جميع الكتب واحدة تلو الأخرى؟ لا، ستستخدم فهرسًا. القاموس (Dictionary) في C# هو هذا الفهرس تمامًا. فهو يخزن أزواج "مفتاح-قيمة" ويسمح بالحصول الفوري على البيانات بواسطة المفتاح.

\n\n

ولكن ماذا تفعل عندما تحتاج ليس فقط إلى العثور على إدخال واحد، بل إلى معالجة جميع محتويات القاموس؟ على سبيل المثال، عرض جميع إعدادات التطبيق، أو حساب المجموع في سلة التسوق لمتجر إلكتروني، أو تحويل البيانات إلى JSON. هنا يطرح السؤال الكلاسيكي: "How to iterate over a dictionary?".

\n\n

على Stack Overflow، حصل هذا السؤال على آلاف المشاهدات. وليس من دون سبب: قد يبدو الأمر بسيطًا؟ لكن المبتدئين غالبًا ما يتعثرون في أنواع البيانات، بينما يهتم المحترفون بالأداء. في هذه المقالة، سنشرح جميع طرق التكرار على القاموس في C#: من foreach البسيط إلى LINQ المتقدم. هيا بنا!

\n\n

1. الأساسيات: هيكل Dictionary في C#

\n\n

قبل أن نبدأ بالتكرار، دعنا نتذكر كيف يبدو قاموس C#. إنها مجموعة عامة من مساحة الأسماء System.Collections.Generic.

\n\n
Dictionary<string, int> ages = new Dictionary<string, int>()\n{\n    { "Анна", 25 },\n    { "Борис", 30 },\n    { "Виктор", 35 }\n};
\n\n

كل عنصر في القاموس هو هيكل KeyValuePair<TKey, TValue>. له خاصيتان: Key و Value. مع هذا الزوج سنعمل أثناء الاجتياز.

\n\n

2. الطريقة الكلاسيكية: foreach على القاموس

\n\n

الطريقة الأكثر شيوعًا للتكرار على القاموس في C# هي حلقة foreach. إنها موجزة وقابلة للقراءة وآمنة.

\n\n
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.

\n\n

نصيحة من المحترفين: إذا كنت لا تريد كتابة النوع الكامل، استخدم var:

\n
foreach (var kvp in ages) { ... }
\n\n

3. المفاتيح فقط أو القيم فقط

\n\n

أحيانًا لا نحتاج إلى الزوج بأكمله. على سبيل المثال، نحتاج فقط إلى عرض قائمة بجميع المفاتيح (الأسماء) أو جميع القيم (الأعمار). لهذا، يحتوي القاموس على الخاصيتين Keys و Values.

\n\n

التكرار على المفاتيح

\n
foreach (string name in ages.Keys)\n{\n    Console.WriteLine($"الاسم: {name}");\n}
\n\n

التكرار على القيم

\n
foreach (int age in ages.Values)\n{\n    Console.WriteLine($"العمر: {age}");\n}
\n\n

هذا أسرع من الحصول على KeyValuePair إذا كنت لا تحتاج إلى الجزء الثاني. كما أن الكود يصبح أنظف.

\n\n

4. الوصول بالفهرس: for و ElementAt

\n\n

يحاول العديد من المبتدئين استخدام for (int i = 0; i < dict.Count; i++). لكن Dictionary في C# لا يدعم المفهرس بالرقم! محاولة كتابة dict[i] ستؤدي إلى خطأ في الترجمة.

\n\n

ولكن يمكن التحايل: الحصول على مجموعة الأزواج عبر .ToList() والوصول إليها بالفهرس.

\n\n
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\n

5.

المدونات

توصيات الكتب