كيفية تكرار جميع قيم Enum في C#: دليل كامل مع أمثلة

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

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

ابدأ الدورة

كيفية تكرار جميع قيم Enum في C#: من المبتدئ إلى المحترف

\n\n

تخيل موقفًا: أنت تكتب لعبة بلغة C#، ولديك تعداد Difficulty بمستويات الصعوبة: Easy, Normal, Hard, Insane. تحتاج إلى عرضها جميعًا في قائمة الاختيار، أو، لنقل، إنشاء قائمة منسدلة للمُكوّن. كيف تفعل ذلك؟ كتابة مصفوفة نصوص يدويًا؟ وماذا لو أضيف مستوى جديد غدًا؟ سيتعين عليك العبث بالكود وتغييره في ثلاثة أماكن.

\n\n

لحسن الحظ، يوجد في C# حل أنيق. السؤال "How to loop through all enum values in C#?" هو أحد أكثر الأسئلة شيوعًا على Stack Overflow (مئات الآلاف من المشاهدات). واليوم سنقوم بتحليله بالكامل. ستتعلم ليس طريقة واحدة، بل 4 طرق لتكرار قيم enum، وستفهم أي منها تستخدم ومتى، وستحصل على كود جاهز يمكنك نسخه إلى مشروعك.

\n\n

هيا بنا!

\n\n
\n\n

ما هو Enum في C# ولماذا نكرره؟

\n\n

Enum (التعداد) هو مجموعة من الثوابت المسماة. بدلاً من تذكر أن 0 = Easy, 1 = Normal, 2 = Hard, تكتب ببساطة Difficulty.Easy. يصبح الكود قابلاً للقراءة وآمنًا.

\n\n

ولكن عندما يحتوي المشروع على 10-20 قيمة enum، سيأتي حتمًا وقت تحتاج فيه إلى الحصول عليها جميعًا. على سبيل المثال:

\n
    \n
  • ملء ComboBox أو Dropdown في واجهة المستخدم.
  • \n
  • إنشاء بيانات اختبارية لجميع الخيارات.
  • \n
  • تطبيق السمات (Attributes) على كل قيمة.
  • \n
  • مقارنة مجموعتين من enum.
  • \n
\n\n

بدلاً من كتابة:

\n
string[] names = { "Easy", "Normal", "Hard", "Insane" };
\n\n

…نستخدم الانعكاس (Reflection) والطرق المضمنة في .NET. هذا مرن وقابل للتوسع ولا يتطلب تحديثًا يدويًا.

\n\n
\n\n

الطريقة 1: الكلاسيكية — Enum.GetValues (الأكثر شيوعًا)

\n\n

هذه هي الإجابة التي ستجدها على Stack Overflow بأعلى عدد من الأصوات. الطريقة Enum.GetValues(typeof(YourEnum)) تُرجع مصفوفة تحتوي على جميع قيم تعداد معين.

\n\n

مثال كود:

\n
using System;\n\npublic enum Difficulty\n{\n    Easy,\n    Normal,\n    Hard,\n    Insane\n}\n\nclass Program\n{\n    static void Main()\n    {\n        Console.WriteLine("جميع مستويات الصعوبة:");\n        \n        // الحصول على مصفوفة قيم enum\n        Difficulty[] allDifficulties = (Difficulty[])Enum.GetValues(typeof(Difficulty));\n        \n        foreach (Difficulty level in allDifficulties)\n        {\n            Console.WriteLine($"المستوى: {level} (القيمة الرقمية: {(int)level})");\n        }\n    }\n}
\n\n

الإخراج في وحدة التحكم:

\n
جميع مستويات الصعوبة:\nالمستوى: Easy (القيمة الرقمية: 0)\nالمستوى: Normal (القيمة الرقمية: 1)\nالمستوى: Hard (القيمة الرقمية: 2)\nالمستوى: Insane (القيمة الرقمية: 3)
\n\n

هام: Enum.GetValues تُرجع مصفوفة من النوع Array، لذا يجب تحويلها صراحةً إلى نوع enum الخاص بك. بدءًا من .NET 5، ظهرت نسخة عامة (Generic): Enum.GetValues<Difficulty>()، وهي أكثر ملاءمة قليلاً.

\n\n
// .NET 5+ \nDifficulty[] allDifficulties = Enum.GetValues<Difficulty>();\nforeach (var level in allDifficulties)\n{\n    Console.WriteLine(level);\n}
\n\n
\n\n

الطريقة 2: الحصول على الأسماء عبر Enum.GetNames

\n\n

أحيانًا تحتاج إلى الأسماء النصية للقيم وليس القيم نفسها (مثلاً لواجهة المستخدم). لهذا يوجد Enum.GetNames. تُرجع هذه الطريقة مصفوفة من النصوص.

\n\n

مثال:

\n
string[] names = Enum.GetNames(typeof(Difficulty));\nConsole.WriteLine("أسماء المستويات:");\nforeach (string name in names)\n{\n    Console.WriteLine(name);\n}
\n\n

الإخراج:

\n
أسماء المستويات:\nEasy\nNormal\nHard\nInsane
\n\n

متى تستخدم؟ إذا كنت بحاجة إلى نصوص (مثل العرض في الواجهة أو التسجيل)، وليس ثوابت enum نفسها.

المدونات

توصيات الكتب