সি # একটি এনামের মাধ্যমে ইটারেটিং? (একটি সিস্টেম সূচীকরণ। অ্যারে)


113

আমার কাছে নিম্নলিখিত কোড রয়েছে:

// 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] ); 
}

তবে আমি মানগুলি সূচী করতে পারি না। এই কাজ করতে একটি সহজ উপায় আছে?

নাকি আমি পুরোপুরি কিছু মিস করেছি!

উত্তর:


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

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

অথবা, আপনি সিস্টেমটি কাস্ট করতে পারেন returned আরে যা ফিরে এসেছে:

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]);
}

তবে, আপনি কী নিশ্চিত যে গেটভ্যালিউস নামগুলি যেভাবে ফেরত দেয় গ্যাটভ্যালু একই ক্রমে মানগুলি ফেরত দেয়?


3
"তবে, আপনি কী নিশ্চিত যে গেটভ্যালিউস নামগুলি যেভাবে ফেরত দেয় গেটভ্যালু একই ক্রমে মানগুলি ফেরত দেয়?" - এটি একটি খুব ভাল পয়েন্ট এবং কিছু যা আমি এখনও সম্বোধন করা আছে! আমি মনে করি আপনার প্রথম সমাধানটি সম্ভবত মান এবং স্ট্রিংগুলিকে নির্ভরযোগ্যভাবে মেলাতে একটি উপায় সরবরাহ করবে
টি কে।

হ্যালো, আমি এই কাজটি করার সময় "সূচক-অমিল" হওয়ার সন্দেহের আগে উল্লেখ করতে দেখেছি; তবে, আমি এখনও আবিষ্কার করতে পারি যে এটি সত্যই উদ্বেগজনক কিনা? এমন কোনও নির্দিষ্ট ঘটনা আছে যার দ্বারা এই অনুমানটি খারাপ হতে পারে? ধন্যবাদ!
ফানকা

আপনি সম্ভবত দ্বিতীয়টি "ভাল" কোন ইন্টিতে নিক্ষেপ করতে চান, যদি আপনি Enum.GetName(typeof(MyEnum), val), (int)val)আউটপুটে অঙ্কের নাম এবং সংখ্যা সরবরাহ করে এমন মানের মিল না মেলে সমস্যা সমাধান করতে চান ।
গ্রেগ

গেটভ্যালিউস এবং গেটনামস একই ক্রমে ফিরে আসে, যথা: "রিটার্ন মান অ্যারের উপাদানগুলি গণনা করা ধ্রুবকের বাইনারি মান অনুসারে বাছাই করে (এটি তাদের স্বাক্ষরবিহীন প্রস্থের দ্বারা)" "
রাসেল বোরোগোভ

আমি বিশ্বাস করি Cast<T>Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()...
আপনিও

33

আপনাকে অ্যারে নিক্ষেপ করতে হবে - প্রত্যাবর্তিত অ্যারেটি আসলে অনুরোধকৃত ধরণের, অর্থাত্ myEnum[]যদি আপনি জিজ্ঞাসা করেন typeof(myEnum):

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

তারপর values[0]ইত্যাদি


9

আপনি সেই অ্যারে বিভিন্ন ধরণের অ্যারে কাস্ট করতে পারেন:

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

অথবা আপনি যদি পূর্ণসংখ্যার মানগুলি চান:

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

আপনি অবশ্যই সেই নিক্ষিপ্ত অ্যারেগুলি পুনরাবৃত্তি করতে পারেন :)


7

অভিধানের তালিকা কেমন?

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));
}

এবং অবশ্যই আপনি অভিধানের মান প্রকারটি আপনার এনাম মানগুলি যাই হোক না কেন তা পরিবর্তন করতে পারেন।


আমি মনে করি এটিই যাওয়ার পথ হবে তবে দুর্ভাগ্যজনকভাবে এনাম কোডের এমন একটি অঞ্চলে রয়েছে যার উপর আমার কোনও নিয়ন্ত্রণ নেই!
টি।

1
একমাত্র সমাধান আমি খুঁজে পেয়েছি যা আসল পূর্ণসংখ্যার এনাম মানগুলি পায়!
শার্পসি

5

আকর্ষণীয় সম্ভাবনা সহ আরও একটি সমাধান:

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;
  } 
}

4

এখানে অন্য একটি। আমাদের এনামভ্যালুগুলির জন্য বন্ধুত্বপূর্ণ নাম দেওয়ার প্রয়োজন ছিল। আমরা প্রতিটি এনাম মানের জন্য একটি কাস্টম স্ট্রিংয়ের মান দেখানোর জন্য System.CompenderModel.DescriptAttribute ব্যবহার করেছি।

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" ফেরার অবসান করবে


1
কেবলমাত্র বর্ণনগুলি স্থিতিশীল হলেই ভাল ... উদাহরণস্বরূপ যদি আপনার বিবরণগুলি পরিবর্তন করতে হয় তবে এই পদ্ধতির কাজ হবে না।
লিলি

3

একটি foreach লুপ ব্যবহার সম্পর্কে কি, সম্ভবত আপনি এটি সঙ্গে কাজ করতে পারে?

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

এরকম কিছু সম্ভবত?


আমার তা হ'ল ... তবে 'সিঙ্ক' তে আমার নাম এবং মান উভয়ই অ্যাক্সেস করা দরকার ... নামগুলি বলুন [2] মানগুলির সাথে যুক্ত হয়েছে [2] এবং এটি কীভাবে অর্জন করতে হয় সে সম্পর্কে আমি নিশ্চিত নই একটি অগ্রণী লুপ!
টি।

আমি একটি উদাহরণ যুক্ত করেছি - দেখুন এটি সাহায্য করে কিনা।
TWith2Sugars

3

পুরানো প্রশ্ন, তবে লিনকিউ ব্যবহার করে কিছুটা ক্লিনার অ্যাপ্রোচ .Cast<>()

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

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

2

অ্যারেতে একটি getValue (Int32) পদ্ধতি রয়েছে যা আপনি নির্দিষ্ট সূচীতে মানটি পুনরুদ্ধার করতে ব্যবহার করতে পারেন।

Array.GetValue


2

আপনি এটি বিন্যাসের স্ট্রিংগুলি ব্যবহার করে সরল করতে পারেন। আমি ব্যবহার বার্তায় নিম্নলিখিত স্নিপেট ব্যবহার করি:

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);
}

ডি ফর্ম্যাট স্পেসিফায়ার এনাম মানকে দশমিক হিসাবে ফর্ম্যাট করে। একটি এক্স স্পেসিফারও রয়েছে যা হেক্সাডেসিমাল আউটপুট দেয়।

জি স্পেসিফায়ার একটি এনুমকে স্ট্রিং হিসাবে ফর্ম্যাট করে। যদি ফ্ল্যাগস অ্যাট্রিবিউটটি এনামে প্রয়োগ করা হয় তবে সম্মিলিত মানগুলিও সমর্থন করে। এখানে একটি এফ নির্দিষ্টকারী রয়েছে যা পতাকাগুলি সর্বদা উপস্থিত থাকায় কাজ করে।

এনাম.ফর্ম্যাট () দেখুন।


2

এনাম.গেটভ্যালুসের ফলাফলগুলিতে, পূর্বে কাস্ট করা সংখ্যার মান উত্পন্ন করে। ToString () ব্যবহার করে বন্ধুত্বপূর্ণ নাম তৈরি হয়। এনাম.গেটনামে অন্য কোনও কল প্রয়োজন নেই।

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
 */

0

আপনার কাস্টম এনুম অবজেক্টটির মাধ্যমে পুনরাবৃত্তি করার একটি সহজ উপায়

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

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

Next

1
আমি মনে করি ওপি সি # এর জন্য জিজ্ঞাসা করেছে।
জেএম

0

প্রাচীন প্রশ্ন, তবে থ্রিডিভের উত্তরটি সবচেয়ে সহজ পদ্ধতির সরবরাহ করেছে। ডিবাগিংয়ের জন্য ডাটাবেসে একটি এনাম মান ডিকোড করতে আমার একটি এসকিএলএল স্ক্রিপ্ট উত্পন্ন করতে একটি সহায়ক সহায়ক পদ্ধতি প্রয়োজন। এটি দুর্দান্ত কাজ করেছে:

    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>()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.