C# بالتكرار خلال التعداد?(الفهرسة النظام.مجموعة)

StackOverflow https://stackoverflow.com/questions/482729

سؤال

لدي البرمجية التالية:

// Obtain the string names of all the elements within myEnum 
String[] names = Enum.GetNames( typeof( myEnum ) );

// Obtain the values of all the elements within myEnum 
Array values = Enum.GetValues( typeof( myEnum ) );

// Print the names and values to file
for ( int i = 0; i < names.Length; i++ )
{
    print( names[i], values[i] ); 
}

بيد أنني لا أستطيع أن مؤشر القيم.هل هناك طريقة أسهل أن تفعل هذا ؟

أو فاتني شيء تماما!

هل كانت مفيدة؟

المحلول

Array values = Enum.GetValues(typeof(myEnum));

foreach( MyEnum val in values )
{
   Console.WriteLine (String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val));
}

أو أنت يمكن أن يلقي النظام.مجموعة التي يتم إرجاعها:

string[] names = Enum.GetNames(typeof(MyEnum));
MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum));

for( int i = 0; i < names.Length; i++ )
{
    print(names[i], values[i]);
}

ولكن يمكنك أن تكون على يقين من أن GetValues إرجاع القيم في نفس الترتيب كما GetNames إرجاع الأسماء ؟

نصائح أخرى

وتحتاج إلى يلقي مجموعة - مجموعة عاد هو في الواقع من النوع المطلوب، أي myEnum[] إذا كنت تسأل عن typeof(myEnum):

myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum));

وبعد ذلك values[0] الخ

ويمكنك أن يلقي صفيف لأنواع مختلفة من المصفوفات:

myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum));

وأو إذا كنت ترغب في قيم الأعداد الصحيحة:

int[] values = (int[])Enum.GetValues(typeof(myEnum));

ويمكنك تكرار تلك المصفوفات محمل بالطبع:)

وماذا عن قائمة القاموس؟

Dictionary<string, int> list = new Dictionary<string, int>();
foreach( var item in Enum.GetNames(typeof(MyEnum)) )
{
    list.Add(item, (int)Enum.Parse(typeof(MyEnum), item));
}

وبالطبع يمكنك تغيير نوع القيمة القاموس إلى أي قيم التعداد الخاصة بك.

وهناك حل آخر، مع إمكانيات مثيرة للاهتمام:

enum Days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

static class Helpers
{
public static IEnumerable<Days> AllDays(Days First)
{
  if (First == Days.Monday)
  {
     yield return Days.Monday;
     yield return Days.Tuesday;
     yield return Days.Wednesday;
     yield return Days.Thursday;
     yield return Days.Friday;
     yield return Days.Saturday;
     yield return Days.Sunday;
  } 

  if (First == Days.Saturday)
  {
     yield return Days.Saturday;
     yield return Days.Sunday;
     yield return Days.Monday;
     yield return Days.Tuesday;
     yield return Days.Wednesday;
     yield return Days.Thursday;
     yield return Days.Friday;
  } 
}

وهنا شيء آخر. كان لدينا حاجة لتقديم أسماء مألوفة لدينا EnumValues. استخدمنا System.ComponentModel.DescriptionAttribute لإظهار قيمة السلسلة المخصصة لكل قيمة التعداد.

public static class StaticClass
{
    public static string GetEnumDescription(Enum currentEnum)
    {
        string description = String.Empty;
        DescriptionAttribute da;

        FieldInfo fi = currentEnum.GetType().
                    GetField(currentEnum.ToString());
        da = (DescriptionAttribute)Attribute.GetCustomAttribute(fi,
                    typeof(DescriptionAttribute));
        if (da != null)
            description = da.Description;
        else
            description = currentEnum.ToString();

        return description;
    }

    public static List<string> GetEnumFormattedNames<TEnum>()
    {
        var enumType = typeof(TEnum);
        if (enumType == typeof(Enum))
            throw new ArgumentException("typeof(TEnum) == System.Enum", "TEnum");

        if (!(enumType.IsEnum))
            throw new ArgumentException(String.Format("typeof({0}).IsEnum == false", enumType), "TEnum");

        List<string> formattedNames = new List<string>();
        var list = Enum.GetValues(enumType).OfType<TEnum>().ToList<TEnum>();

        foreach (TEnum item in list)
        {
            formattedNames.Add(GetEnumDescription(item as Enum));
        }

        return formattedNames;
    }
}

في استخدام

 public enum TestEnum
 { 
        [Description("Something 1")]
        Dr = 0,
        [Description("Something 2")]
        Mr = 1
 }



    static void Main(string[] args)
    {

        var vals = StaticClass.GetEnumFormattedNames<TestEnum>();
    }

وهذا سينتهي العودة "شيء 1"، "شيء 2"

وماذا عن استخدام حلقة foreach، ربما يمكن أن تعمل مع ذلك؟

  int i = 0;
  foreach (var o in values)
  {
    print(names[i], o);
    i++;
  }

وشيء من هذا القبيل ربما؟

وقديم السؤال، ولكن نهج أنظف قليلا باستخدام .Cast<>() LINQ ل

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

foreach(var val in values)
{
    Console.WriteLine("Member: {0}",val.ToString());     
}

وصفيف لديه أسلوب GetValue (Int32) التي يمكنك استخدامها لاسترداد قيمة في الفهرس المحدد.

Array.GetValue

ويمكنك تبسيط ذلك باستخدام سلاسل التنسيق. يمكنني استخدام المقتطف التالي في رسائل الاستعمال:

writer.WriteLine("Exit codes are a combination of the following:");
foreach (ExitCodes value in Enum.GetValues(typeof(ExitCodes)))
{
    writer.WriteLine("   {0,4:D}: {0:G}", value);
}

وومحدد التنسيق D تنسيقات قيمة التعداد كما عشري. وهناك أيضا محدد X التي تعطي الناتج عشري.

وومحدد G صيغ على التعداد كسلسلة. إذا تم تطبيقها على التعداد السمة أعلام ويدعم القيم ثم الجمع أيضا. هناك ومحدد F الذي يعمل كما لو أعلام موجودة دائما.

وانظر Enum.Format ().

في نتائج Enum.GetValues، صب لكثافة العمليات تنتج قيمة رقمية. باستخدام ToString () تنتج الاسم المألوف. هناك حاجة إلى أي دعوات أخرى لEnum.GetName.

public enum MyEnum
{
    FirstWord,
    SecondWord,
    Another = 5
};

// later in some method  

 StringBuilder sb = new StringBuilder();
 foreach (var val in Enum.GetValues(typeof(MyEnum))) {
   int numberValue = (int)val;
   string friendyName = val.ToString();
   sb.Append("Enum number " + numberValue + " has the name " + friendyName + "\n");
 }
 File.WriteAllText(@"C:\temp\myfile.txt", sb.ToString());

 // Produces the output file contents:
 /*
 Enum number 0 has the name FirstWord
 Enum number 1 has the name SecondWord
 Enum number 5 has the name Another
 */

وهنا هو طريقة بسيطة لتكرار خلال عهدك الكائن التعداد

For Each enumValue As Integer In [Enum].GetValues(GetType(MyEnum))

     Print([Enum].GetName(GetType(MyEnum), enumValue).ToString)

Next

والسؤال القديم، ولكن الجواب 3Dave والمقدم أسهل النهج. أنا في حاجة إلى أسلوب مساعد القليل لإنشاء برنامج نصي SQL لفك قيمة التعداد في قاعدة البيانات من أجل التصحيح. عملت كبيرة:

    public static string EnumToCheater<T>() {
        var sql = "";
        foreach (var enumValue in Enum.GetValues(typeof(T)))
            sql += $@"when {(int) enumValue} then '{enumValue}' ";
        return $@"case ?? {sql}else '??' end,";
    }

ولقد كان في أسلوب ثابت، لذلك الاستخدام هو:

var cheater = MyStaticClass.EnumToCheater<MyEnum>()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top