c# شرح - يمكنك من خلال حلقة جميع القيم التعداد؟




enum combination (8)

foreach (EMyEnum val in Enum.GetValues(typeof(EMyEnum)))
{
   Console.WriteLine(val);
}

الائتمان إلى جون سكيت هنا: http://bytes.com/groups/net-c/266447-how-loop-each-items-enum

هذا السؤال لديه بالفعل إجابة هنا:
كيف تعداد التعداد؟ 14 إجابات

public enum Foos
{
    A,
    B,
    C
}

هل هناك طريقة للتكرار من خلال القيم المحتملة Foos ؟

في الأساس؟

foreach(Foo in Foos)

نعم ، يمكنك استخدام طريقة GetValue‍‍‍s :

var values = Enum.GetValues(typeof(Foos));

أو النسخة المكتوبة:

var values = Enum.GetValues(typeof(Foos)).Cast<Foos>();

لقد أضفت منذ فترة طويلة وظيفة مساعدة إلى مكتبتي الخاصة لمجرد هذه المناسبة:

public static class EnumUtil {
    public static IEnumerable<T> GetValues<T>() {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }
}

الاستعمال:

var values = EnumUtil.GetValues<Foos>();

محدث
في بعض الأحيان ، أرى تعليقًا يعيدني إلى جوابي القديم ، وأعتقد أنني سأفعله بشكل مختلف الآن. في هذه الأيام كنت أكتب:

private static IEnumerable<T> GetEnumValues<T>()
{
    // Can't use type constraints on value types, so have to do check like this
    if (typeof(T).BaseType != typeof(Enum))
    {
        throw new ArgumentException("T must be of type System.Enum");
    }

    return Enum.GetValues(typeof(T)).Cast<T>();
}

static void Main(string[] args)
{
    foreach (int value in Enum.GetValues(typeof(DaysOfWeek)))
    {
        Console.WriteLine(((DaysOfWeek)value).ToString());
    }

    foreach (string value in Enum.GetNames(typeof(DaysOfWeek)))
    {
        Console.WriteLine(value);
    }
    Console.ReadLine();
}

public enum DaysOfWeek
{
    monday,
    tuesday,
    wednesday
}

foreach (Foos foo in Enum.GetValues(typeof(Foos)))
{
    ...
}

foreach(Foos foo in Enum.GetValues(typeof(Foos)))

 Enum.GetValues(typeof(Foos))

تمت إضافة التعداد إلى Python 3.4 كما هو موضح في PEP 435 . كما تم إعادته إلى 3.3 و 3.2 و 3.1 و 2.7 و 2.6 و 2.5 و 2.4 على pypi.

بالنسبة إلى تقنيات التعداد الأكثر تقدمًا ، حاول استخدام مكتبة aenum (2.7 ، 3.3+ ، نفس المؤلف مثل enum34 . الشفرة ليست متوافقة تمامًا بين py2 و py3 ، على سبيل المثال ، ستحتاج إلى __order__ في python 2 ).

  • لاستخدام enum34 ، $ pip install enum34
  • لاستخدام aenum ، $ pip install aenum

سيؤدي تثبيت enum (بدون أرقام) إلى تثبيت إصدار مختلف تمامًا وغير متوافق.

from enum import Enum     # for enum34, or the stdlib version
# from aenum import Enum  # for the aenum version
Animal = Enum('Animal', 'ant bee cat dog')

Animal.ant  # returns <Animal.ant: 1>
Animal['ant']  # returns <Animal.ant: 1> (string lookup)
Animal.ant.name  # returns 'ant' (inverse lookup)

أو مكافئ:

class Animal(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4

في الإصدارات السابقة ، إحدى الطرق لإنجاز التعدادات هي:

def enum(**enums):
    return type('Enum', (), enums)

الذي يستخدم مثل:

>>> Numbers = enum(ONE=1, TWO=2, THREE='three')
>>> Numbers.ONE
1
>>> Numbers.TWO
2
>>> Numbers.THREE
'three'

يمكنك أيضًا دعم التعداد التلقائي بسهولة باستخدام شيء مثل هذا:

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)

واستخدمت هكذا:

>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0
>>> Numbers.ONE
1

يمكن إضافة الدعم لتحويل القيم إلى الأسماء بهذه الطريقة:

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.iteritems())
    enums['reverse_mapping'] = reverse
    return type('Enum', (), enums)

هذا الكتابة فوق أي شيء بهذا الاسم ، ولكنه مفيد لتقديم التعدادات الخاصة بك في الإخراج. سيقوم بإلقاء KeyError في حالة عدم وجود التعيين العكسي. مع المثال الأول:

>>> Numbers.reverse_mapping['three']
'THREE'




c# .net enums language-features