لماذا سؤال "How can I enumerate an enum?" شائع جدًا؟
\n\nإذا كنت قد كتبت بلغة C# من قبل وواجهت التعدادات (enum)، فبالتأكيد سألت نفسك: "كيف يمكنني الحصول على جميع قيم هذا enum؟". هذا السؤال هو من الأسئلة الرائجة جدًا على Stack Overflow، حيث حصد آلاف المشاهدات. وليس من المستغرب: تعداد enum هو أحد تلك المهام التي تبدو بسيطة، ولكن بدون معرفة الصيغة الصحيحة قد تربك حتى المطورين ذوي الخبرة.
في هذه المقالة، سنشرح كيفية تعداد جميع قيم enum في C# بشكل صحيح، وسنقدم أمثلة عملية على الكود يمكنك نسخها مباشرة إلى مشروعك، وسنتحدث عن المزالق المحتملة. هيا بنا!
\n\nما هو enum في C#؟ تذكير سريع
\n\nEnum (التعداد) هو نوع بيانات يسمح لك بتعيين مجموعة من الثوابت المسماة. على سبيل المثال، أيام الأسبوع، حالات الطلب، أو أنواع الأخطاء. في C#، يتم تعريف enum كالتالي:
\n\npublic enum DayOfWeek\n{\n Monday,\n Tuesday,\n Wednesday,\n Thursday,\n Friday,\n Saturday,\n Sunday\n}\n\nيتم تعيين قيمة عدد صحيح لكل عنصر افتراضيًا (بدءًا من 0). ولكن غالبًا ما تنشأ الحاجة إلى التكرار على جميع عناصر enum - على سبيل المثال، لعرضها في قائمة منسدلة، أو إنشاء مصفوفة، أو التحقق من وجود قيمة.
\n\nكيفية تعداد جميع قيم enum: الطريقة الأساسية
\n\nالطريقة الأكثر شيوعًا وبساطة هي استخدام الطريقة الثابتة Enum.GetValues(). تقوم بإرجاع مصفوفة تحتوي على جميع قيم التعداد المحدد. إليك كيفية عملها:
using System;\n\npublic class Program\n{\n public enum Status\n {\n New,\n InProgress,\n Completed,\n Cancelled\n }\n\n public static void Main()\n {\n // الحصول على جميع قيم enum\n Status[] allStatuses = (Status[])Enum.GetValues(typeof(Status));\n\n // التكرار عليها باستخدام foreach\n foreach (Status status in allStatuses)\n {\n Console.WriteLine(status);\n }\n }\n}\n\nنتيجة التنفيذ:
\nNew\nInProgress\nCompleted\nCancelled\n\nلاحظ أننا نقوم بتحويل النتيجة صراحة إلى مصفوفة Status[]، لأن Enum.GetValues() تُرجع Array (غير محدد النوع).
البديل: Enum.GetNames()
\n\nإذا كنت تحتاج إلى الأسماء النصية للقيم وليس القيم نفسها، استخدم Enum.GetNames():
string[] statusNames = Enum.GetNames(typeof(Status));\nforeach (string name in statusNames)\n{\n Console.WriteLine(name);\n}\n\nستكون النتيجة مماثلة، ولكن نوع العنصر هو string وليس Status. هذا مفيد عند العمل مع واجهات المستخدم أو التسلسل.
النهج الحديث: النسخة العامة (C# 7.3+)
\n\nبدءًا من C# 7.3، لدينا طريقة أكثر أناقة - Enum.GetValues<T>(). تُرجع مصفوفة من النوع المحدد، ولا حاجة للتحويل:
Status[] allStatuses = Enum.GetValues<Status>();\n\nforeach (Status status in allStatuses)\n{\n Console.WriteLine($"ID: {(int)status}, Name: {status}");\n}\n\nهذه الطريقة أقصر وأكثر أمانًا من حيث الأنواع. إذا كنت تستخدم إصدارًا حديثًا من C# (ويجب عليك ذلك!)، فإنني أوصي بها.
\n\nمثال من الحياة الواقعية: تعبئة قائمة منسدلة
\n\nتخيل أنك تكتب تطبيقًا لإدارة المهام. تحتاج إلى عرض قائمة الحالات المحتملة للمستخدم في قائمة منسدلة. إليك كيفية القيام بذلك باستخدام تعداد enum:
\n\nusing System;\nusing System.Collections.Generic;\n\npublic class TaskManager\n{\n public enum TaskStatus\n {\n NotStarted,\n InProgress,\n WaitingForReview,\n Done\n }\n\n publ