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

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

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

ابدأ الدورة

لماذا سؤال "How can I enumerate an enum?" شائع جدًا؟

\n\n

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

\n\n

في هذه المقالة، سنشرح كيفية تعداد جميع قيم enum في C# بشكل صحيح، وسنقدم أمثلة عملية على الكود يمكنك نسخها مباشرة إلى مشروعك، وسنتحدث عن المزالق المحتملة. هيا بنا!

\n\n

ما هو enum في C#؟ تذكير سريع

\n\n

Enum (التعداد) هو نوع بيانات يسمح لك بتعيين مجموعة من الثوابت المسماة. على سبيل المثال، أيام الأسبوع، حالات الطلب، أو أنواع الأخطاء. في C#، يتم تعريف enum كالتالي:

\n\n
public 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(). تقوم بإرجاع مصفوفة تحتوي على جميع قيم التعداد المحدد. إليك كيفية عملها:

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

نتيجة التنفيذ:

\n
New\nInProgress\nCompleted\nCancelled
\n\n

لاحظ أننا نقوم بتحويل النتيجة صراحة إلى مصفوفة Status[]، لأن Enum.GetValues() تُرجع Array (غير محدد النوع).

\n\n

البديل: Enum.GetNames()

\n\n

إذا كنت تحتاج إلى الأسماء النصية للقيم وليس القيم نفسها، استخدم Enum.GetNames():

\n\n
string[] statusNames = Enum.GetNames(typeof(Status));\nforeach (string name in statusNames)\n{\n    Console.WriteLine(name);\n}
\n\n

ستكون النتيجة مماثلة، ولكن نوع العنصر هو string وليس Status. هذا مفيد عند العمل مع واجهات المستخدم أو التسلسل.

\n\n

النهج الحديث: النسخة العامة (C# 7.3+)

\n\n

بدءًا من C# 7.3، لدينا طريقة أكثر أناقة - Enum.GetValues<T>(). تُرجع مصفوفة من النوع المحدد، ولا حاجة للتحويل:

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

المدونات

توصيات الكتب