কিভাবে একটি এনাম গণনা করা যায়


3763

আপনি কীভাবে enumসি # তে একটি গণনা করতে পারেন ?

যেমন নীচের কোডটি সংকলন করে না:

public enum Suit
{
    Spades,
    Hearts,
    Clubs,
    Diamonds
}

public void EnumerateAllSuitsDemoMethod()
{
    foreach (Suit suit in Suit)
    {
        DoSomething(suit);
    }
}

এবং এটি নিম্নলিখিত সংকলন-সময় ত্রুটি দেয়:

'স্যুট' একটি 'টাইপ' তবে এটি 'ভেরিয়েবল' এর মতো ব্যবহৃত হয়

এটি Suitকীওয়ার্ডে ব্যর্থ হয় , দ্বিতীয়টি।


17
এছাড়াও দেখুন ... stackoverflow.com/questions/972307/...
SteveC

2
আপনি সি # এনামগুলির ইনস এবং আউটগুলি পরীক্ষা করতে চাইতে পারেন , যা
এটির

উত্তর:


4612
foreach (Suit suit in (Suit[]) Enum.GetValues(typeof(Suit)))
{
}

দ্রষ্টব্য : Theালাই (Suit[])কঠোরভাবে প্রয়োজনীয় নয়, তবে এটি কোডটি 0.5 এনএস আরও দ্রুত করে তোলে


97
আপনার যদি তালিকা তালিকায় সদৃশ মান থাকে তবে এটি কাজ করে না।
জেসি

10
আমি কেবল উল্লেখ করতে চাই যে এটি, দুর্ভাগ্যক্রমে রূপালী আলোতে কাজ করবে না, যেহেতু সিলভারলাইট লাইব্রেরিটি তৈরি করে না enum.GetValues। এক্ষেত্রে আপনাকে প্রতিবিম্ব ব্যবহার করতে হবে।
গিয়াকোমো Tagliabue

146
এই @Jessy করে মত সদৃশ পরিস্থিতিতে ক্ষেত্রে কাজ enum E {A = 0, B = 0}Enum.GetValuesদুটি মানের ফলাফলগুলি একই রকম হলেও ফিরে আসবে। E.A == E.Bসত্য, তাই পার্থক্য নেই। আপনি যদি স্বতন্ত্র নাম চান, তবে আপনার সন্ধান করা উচিত Enum.GetNames
নওফাল

13
তারপরে যদি আপনার এনামে ডুপ্লিকেট / প্রতিশব্দ থাকে এবং আপনি অন্য আচরণ চান, আপনি লিনকের Distinctএক্সটেনশন (.NET 3.5 থেকে) ব্যবহার করতে পারেন , তাই foreach (var suit in ((Suit[])Enum.GetValues(typeof(Suit))).Distinct()) { }
জেপ্প স্টিগ নীলসেন

42
আমি varটাইপটি ব্যবহার করার চেষ্টা করার ভুল করেছিলাম । সংকলক Objectএনামের পরিবর্তে চলকটিকে একটি করে তুলবে । এনামের প্রকারটি সুস্পষ্টভাবে তালিকাভুক্ত করুন।
jpmc26

695

আমার কাছে দেখে মনে হচ্ছে আপনি প্রতিটি এনামের নামগুলি মানগুলির চেয়ে প্রিন্ট করতে চান। যে ক্ষেত্রে Enum.GetNames()সঠিক পদ্ধতির বলে মনে হচ্ছে।

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (string name in Enum.GetNames(typeof(Suits)))
    {
        System.Console.WriteLine(name);
    }
}

যাইহোক, মান বাড়ানো কোনও এনমের মানগুলি গণনা করার পক্ষে ভাল উপায় নয়। পরিবর্তে আপনার এটি করা উচিত।

আমি Enum.GetValues(typeof(Suit))পরিবর্তে ব্যবহার করতে হবে।

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (var suit in Enum.GetValues(typeof(Suits)))
    {
        System.Console.WriteLine(suit.ToString());
    }
}

2
ভিবি সিন্ট্যাক্স এখানে: লিঙ্ক
AndruWitta

আমি আমার দিক থেকে একটি ছোট নিম্নলিখিত পরিবর্তনগুলি সহ আপনার ভার্সনটি নিয়ে এল: Enum.GetValues(typeof(Suits)).OfType<Suits>().ToArray()Suitsসেক্ষেত্রে আমি এনুম আইটেমগুলির অ্যারে পুনরুক্ত করতে পারি , স্ট্রিং নয়।
বড়বাস

@ বরবস কেন শুধু করেন না Suits suit in Enum.GetValues(typeof(Suits))?
থিমডেঙ্কিং

ওহ, মানুষ! অবশ্যই, নির্ভুল টাইপ ব্যবহার করা এই sh ... কোডের ভয়ানক অংশের চেয়ে ভাল দেখাচ্ছে !
বড়বাস

337

সহজ এনাম ব্যবহারের জন্য আমি কিছু এক্সটেনশন করেছি। কেউ এটি ব্যবহার করতে পারে ...

public static class EnumExtensions
{
    /// <summary>
    /// Gets all items for an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>(this Enum value)
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }

    /// <summary>
    /// Gets all items for an enum type.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>() where T : struct
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }

    /// <summary>
    /// Gets all combined items from an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    /// <example>
    /// Displays ValueA and ValueB.
    /// <code>
    /// EnumExample dummy = EnumExample.Combi;
    /// foreach (var item in dummy.GetAllSelectedItems<EnumExample>())
    /// {
    ///    Console.WriteLine(item);
    /// }
    /// </code>
    /// </example>
    public static IEnumerable<T> GetAllSelectedItems<T>(this Enum value)
    {
        int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);

        foreach (object item in Enum.GetValues(typeof(T)))
        {
            int itemAsInt = Convert.ToInt32(item, CultureInfo.InvariantCulture);

            if (itemAsInt == (valueAsInt & itemAsInt))
            {
                yield return (T)item;
            }
        }
    }

    /// <summary>
    /// Determines whether the enum value contains a specific value.
    /// </summary>
    /// <param name="value">The value.</param>
    /// <param name="request">The request.</param>
    /// <returns>
    ///     <c>true</c> if value contains the specified value; otherwise, <c>false</c>.
    /// </returns>
    /// <example>
    /// <code>
    /// EnumExample dummy = EnumExample.Combi;
    /// if (dummy.Contains<EnumExample>(EnumExample.ValueA))
    /// {
    ///     Console.WriteLine("dummy contains EnumExample.ValueA");
    /// }
    /// </code>
    /// </example>
    public static bool Contains<T>(this Enum value, T request)
    {
        int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);
        int requestAsInt = Convert.ToInt32(request, CultureInfo.InvariantCulture);

        if (requestAsInt == (valueAsInt & requestAsInt))
        {
            return true;
        }

        return false;
    }
}

এনাম নিজেই ফ্ল্যাগঅ্যাট্রিবিউটে সজ্জিত হতে হবে :

[Flags]
public enum EnumExample
{
    ValueA = 1,
    ValueB = 2,
    ValueC = 4,
    ValueD = 8,
    Combi = ValueA | ValueB
}

13
প্রথম এক্সটেনশন পদ্ধতির জন্য একটি লাইনার; এটা আর অলস নয়। প্রত্যাবর্তন এনাম.গেটভ্যালিউস (টাইফফ (টি)) .ালাই করুন <টি> ();
লেইউ

2
বিকল্পভাবে আপনি অফ টাইপটিও ব্যবহার করতে পারেন: এনাম.গেটভ্যালু (টাইপফ (টি)) Of অফ টাইপ <টি> ()। এটি খুব খারাপ সেখানে GetValues ​​<T> () এর জেনেরিক সংস্করণ নেই তবে এটি আরও স্পষ্ট হবে।
jpierson

3
হয়তো কেউ এই এক্সটেনশনগুলি কীভাবে ব্যবহার করবেন তা দেখাতে পারে? সংকলক এনাম এনামেক্সামালে এক্সটেনশন পদ্ধতিগুলি দেখায় না।
টমাস

1
এই ফাংশনগুলি কীভাবে কাজে লাগানো যায় কেউ উদাহরণ যোগ করতে পারে?
অশ্বিনী ভার্মা

3
পুনঃব্যবহারযোগ্য কোডের জন্য +1: উদাহরণস্বরূপ - একটি লাইব্রেরিতে এই এক্সটেনশন পদ্ধতিগুলি সংরক্ষণ করুন এবং এটি [ফ্ল্যাগস] পাবলিক এনাম মাইটাইপস {নাম 1, নাম 2}; তালিকা <স্ট্রিং> মাই টাইপনামস = মাইটাইপস.গেটএলটাইমস ();
কৃষ্ণ

178

.NET ফ্রেমওয়ার্কের কয়েকটি সংস্করণ সমর্থন করে না Enum.GetValuesআইডিয়াস ২.০ থেকে এখানে একটি ভাল কাজ রয়েছে : কমপ্যাক্ট ফ্রেমওয়ার্কে এনাম.গেটভ্যালু :

public Enum[] GetValues(Enum enumeration)
{
    FieldInfo[] fields = enumeration.GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
    Enum[] enumerations = new Enum[fields.Length];

    for (var i = 0; i < fields.Length; i++)
        enumerations[i] = (Enum) fields[i].GetValue(enumeration);

    return enumerations;
}

প্রতিবিম্বের সাথে জড়িত যে কোনও কোডের মতোই , এটি একবারে চালিত হয় এবং ফলাফলগুলি ক্যাশে হয় তা নিশ্চিত করার জন্য আপনার পদক্ষেপ নেওয়া উচিত।


18
তালিকার তাত্ক্ষণিকতার পরিবর্তে এখানে ফলন কীওয়ার্ডটি কেন ব্যবহার করবেন না?
এরিক মিক্কেলসেন 16'11

1
বা সংক্ষিপ্ত:return type.GetFields().Where(x => x.IsLiteral).Select(x => x.GetValue(null)).Cast<Enum>();
নওফাল

7
@ নওফাল: লিনক উপলব্ধ নেই। নেট সিএফ 2.0।
গ্যাব্রিয়েল জিএম

@ একেভু এমভিসির এই ড্রপডাউনলিস্টে এই এনাম মানগুলিকে কীভাবে যুক্ত করবেন?
জ্যাক


97

আমি মনে করি এটি অন্যান্য পরামর্শের চেয়ে বেশি দক্ষ কারণ GetValues()প্রতিবার আপনার লুপ থাকলে ডাকা হয় না। এটি আরও সংক্ষিপ্ত। এবং আপনি একটি সংকলন-সময় ত্রুটি পান, রানটাইম ব্যতিক্রম নয় যদি Suitএটি না হয় enum

EnumLoop<Suit>.ForEach((suit) => {
    DoSomethingWith(suit);
});

EnumLoop এই সম্পূর্ণ জেনেরিক সংজ্ঞা আছে:

class EnumLoop<Key> where Key : struct, IConvertible {
    static readonly Key[] arr = (Key[])Enum.GetValues(typeof(Key));
    static internal void ForEach(Action<Key> act) {
        for (int i = 0; i < arr.Length; i++) {
            act(arr[i]);
        }
    }
}

6
এই জাতীয় জেনারিক ব্যবহার করে যত্নশীল। আপনি যদি EnumLoopএমন কোনও প্রকারের সাথে ব্যবহার করার চেষ্টা করেন যা এনাম নয় তবে এটি সূক্ষ্ম সংকলন করবে, তবে রানটাইমটিতে একটি ব্যতিক্রম ছুঁড়ে দেবে।
এসভিক

7
আপনাকে ধন্যবাদ। রানটাইম ব্যতিক্রমগুলি এই পৃষ্ঠার অন্যান্য উত্তরগুলির সাথে প্রকৃতপক্ষে ঘটবে ... এটি ব্যতীত কারণ আমি "যেখানে কী: কাঠামো, আইকনভার্টেবল" যুক্ত করেছি যাতে আপনি বেশিরভাগ ক্ষেত্রে একটি সংকলন সময় ত্রুটি পান।
জেমস

3
না, গেটভ্যালু () কে পূর্বে একবারে ডাকা হয়।
অ্যালেক্স ব্লোখা

4
জেমস, আমি আপনার ক্লাসকে নিরুৎসাহিত করব কারণ চতুর লিখতে খুব ভাল তবে প্রোডাকশন কোডে যা অনেক লোক বজায় রাখে এবং আপডেট করবে, চতুর অতিরিক্ত কাজ। যদি এটি একটি বড় সঞ্চয় করে বা অনেক বেশি ব্যবহৃত হয় - সুতরাং সঞ্চয়গুলি বড় হয় এবং লোকেরা এটির সাথে পরিচিত হবে - এটি মূল্যবান তবে বেশিরভাগ ক্ষেত্রে এটি কোডটি পড়তে এবং আপডেট করার চেষ্টা করা লোককে ধীর করে দেয় এবং একটি সম্ভাব্য ভূমিকা রাখে ভবিষ্যতে উত্স বাগ। কম কোড আরও ভাল :) কম জটিলতা আরও ভাল।
গ্র্যান্ট এম

2
@ গ্রান্টম কেন? এই কোডটি জটিল নয় এবং এটি অবিশ্বাস্যভাবে ছোট। তার উপরে, ক্লাসটি একবার লেখার সাথে সাথে কোডের সংক্ষিপ্ত পুনরাবৃত্তিগুলি তার উদাহরণ অনুসারে মঞ্জুরি দেবে। এটি অত্যন্ত পরিষ্কার, আপনি যদি সেই কোডটি আপডেট করতে না পারেন তবে আপনি সম্ভবত কোনও সংস্থার কোড আপডেট করতে পারবেন না।
ডিস্পার্সিয়া

77

আপনি সিলভারলাইটে পাবেন Enum.GetValues()না ।

আইনার ইনজেব্রিগটসেনের মূল ব্লগ পোস্ট :

public class EnumHelper
{
    public static T[] GetValues<T>()
    {
        Type enumType = typeof(T);

        if (!enumType.IsEnum)
        {
            throw new ArgumentException("Type '" + enumType.Name + "' is not an enum");
        }

        List<T> values = new List<T>();

        var fields = from field in enumType.GetFields()
                     where field.IsLiteral
                     select field;

        foreach (FieldInfo field in fields)
        {
            object value = field.GetValue(enumType);
            values.Add((T)value);
        }

        return values.ToArray();
    }

    public static object[] GetValues(Type enumType)
    {
        if (!enumType.IsEnum)
        {
            throw new ArgumentException("Type '" + enumType.Name + "' is not an enum");
        }

        List<object> values = new List<object>();

        var fields = from field in enumType.GetFields()
                     where field.IsLiteral
                     select field;

        foreach (FieldInfo field in fields)
        {
            object value = field.GetValue(enumType);
            values.Add(value);
        }

        return values.ToArray();
    }
}

2
দুর্দান্ত সমাধান, তবে কিছু রিফ্যাক্টরিং আরও ভাল হবে! :)
নওফাল

আমি .NET Framework 4.0 & Silverlight enum.getvalues কাজ ব্যবহার করছি, কোড আমি ব্যবহার করে তা হল ---> enum.GetValues (typeof (enum))
আনন্দ

2
সি # 7.3 (ভিজ্যুয়াল স্টুডিও 2017 ≥ v15.7) দিয়ে শুরু করে, কেউ ব্যবহার করতে পারবেনwhere T: Enum
ইয়াহু সিরিয়াস

59

আমার সমাধান .NET কমপ্যাক্ট ফ্রেমওয়ার্ক (3.5) এ কাজ করে এবং সংকলন সময়ে টাইপ চেকিং সমর্থন করে :

public static List<T> GetEnumValues<T>() where T : new() {
    T valueType = new T();
    return typeof(T).GetFields()
        .Select(fieldInfo => (T)fieldInfo.GetValue(valueType))
        .Distinct()
        .ToList();
}

public static List<String> GetEnumNames<T>() {
    return typeof (T).GetFields()
        .Select(info => info.Name)
        .Distinct()
        .ToList();
}
  • কেউ যদি কীভাবে এ থেকে মুক্তি পেতে পারেন তবে T valueType = new T()আমি সমাধানটি দেখে খুশি হব।

একটি কল এর মত দেখতে হবে:

List<MyEnum> result = Utils.GetEnumValues<MyEnum>();

2
ব্যবহার সম্পর্কে কি T valueType = default(T)?
অলিভার

দুর্দান্ত, আমি সেই কীওয়ার্ডটিও জানতাম না। সর্বদা নতুন কিছু শিখতে চমৎকার। ধন্যবাদ! এটি কি সর্বদা একই বস্তুর রেফারেন্সটি ফেরত দেয় বা প্রতিবার ডিফল্ট বিবৃতিটি বলা হলে এটি কোনও নতুন উদাহরণ তৈরি করে? আমি এ পর্যন্ত নেট সম্পর্কে কিছু খুঁজে পাইনি, তবে এটি প্রতিবার নতুন ঘটনা তৈরি করলে, এটি আমি যে উদ্দেশ্যে সন্ধান করছিলাম (এক-লাইনার থাকা def) এটি এক ধরণের পরাস্ত করে।
ম্যালাক্স

1
এটি কি গণনার উপরে প্রতিটি পুনরাবৃত্তির জন্য একটি নতুন উদাহরণ তৈরি করবে না?
মল্লক্স

1
-1 "সংকলন সময়ে টাইপ চেকিং সমর্থন করে:" এর জন্য। কি ধরণের চেকিং? এটি যে কোনও জন্য কাজ করবে new() T। এছাড়াও, আপনার মোটেও দরকার নেই new T(), আপনি একা কেবল স্থির ক্ষেত্রগুলি নির্বাচন করতে পারেন এবং করতে পারেন .GetValue(null)। অউব্রির উত্তর দেখুন।
নওফাল

2
সি # 7.3 (ভিজ্যুয়াল স্টুডিও 2017 ≥ v15.7) দিয়ে শুরু করে, কেউ ব্যবহার করতে পারবেনwhere T: Enum
ইয়াহু সিরিয়াস


50
public void PrintAllSuits()
{
    foreach(string suit in Enum.GetNames(typeof(Suits)))
    {
        Console.WriteLine(suit);
    }
}

2
এটি একটি স্ট্রিংকে গণ্য করে, things জিনিসগুলিকে একটি গণনা মূল্যে রূপান্তর করতে ভুলবেন না যাতে গণনাটি গণনা করা যায়।
ইয়ান বয়ড

1
আমি আপনার সম্পাদনা থেকে দেখছি যে আপনি প্রকৃতপক্ষে এনামগুলিতে তাদের পরিচালনা করতে চান, উপরের কোডটি আপনার মূল পোস্টটিকে সম্বোধন করেছে।
জোশুয়া ড্রাক

49
foreach (Suit suit in Enum.GetValues(typeof(Suit))) { }

আমি অস্পষ্ট গুজব শুনেছি যে এটি মারাত্মকভাবে ধীর। কেউ জানেন? - অরিওন এডওয়ার্ডস 15 অক্টোবর 1-07 এ '08

আমি মনে করি অ্যারে ক্যাশে করা এটি যথেষ্ট গতিবেগ করবে। দেখে মনে হচ্ছে আপনি প্রতিবার একটি নতুন অ্যারে পেয়েছেন (প্রতিবিম্বের মাধ্যমে)। বরং:

Array enums = Enum.GetValues(typeof(Suit));
foreach (Suit suitEnum in enums) 
{
    DoSomething(suitEnum);
}

এটা অন্তত একটু দ্রুত, তাই না?


5
যদিও এই সংকলকটির যত্ন নেওয়া উচিত।
স্টিফান বিজজিটার

@ স্টাফানবিজিটার বাহ, আপনি এই সম্পর্কে খুব নিচে পড়ছেন :-) আমি সম্মত, সংকলকটি আমার সমাধানটিকে অপ্রয়োজনীয় করে তুলবে।
সীমিত প্রায়শ্চিত্ত

1
এই প্রয়োজন হয় না. আইএলএসপি-র সংকলিত কোডের দিকে তাকানো, সংকলক ইতিমধ্যে এটি করেছে। কেন এই উত্তরটি মোটেও upvated হয়, খুব কম 35 বার?
mhenry1384

1
এটি upvated একটি দীর্ঘ সময় আগে। অনেক অনেক আগে আমি বাজি রেখেছিলাম যে সংকলকটি এর পরেও এটি সমাধান করে ফেলত, যদিও। কিন্তু এটা নিশ্চিত দেখায় বেশী না performant, এটা কী? ;-)
সীমিত প্রায়শ্চিত্ত

32

তিনটি উপায়:

  1. Enum.GetValues(type) // যেহেতু .NET 1.1, সিলভারলাইট বা। নেট কমপ্যাক্ট ফ্রেমওয়ার্কে নেই
  2. type.GetEnumValues() // শুধুমাত্র নেট। 4 এবং উপরে
  3. type.GetFields().Where(x => x.IsLiteral).Select(x => x.GetValue(null)) // সর্বত্র কাজ করে

GetEnumValuesটাইপ দৃষ্টান্তে কেন চালু করা হয়েছিল তা আমি নিশ্চিত নই । এটি আমার পক্ষে মোটেও পঠনযোগ্য নয়।


একটি সহায়ক শ্রেণীর মতো Enum<T>হওয়া আমার পক্ষে সবচেয়ে পঠনযোগ্য এবং স্মরণীয়:

public static class Enum<T> where T : struct, IComparable, IFormattable, IConvertible
{
    public static IEnumerable<T> GetValues()
    {
        return (T[])Enum.GetValues(typeof(T));
    }

    public static IEnumerable<string> GetNames()
    {
        return Enum.GetNames(typeof(T));
    }
}

এখন আপনি কল:

Enum<Suit>.GetValues();

// Or
Enum.GetValues(typeof(Suit)); // Pretty consistent style

পারফরম্যান্সের বিষয়টি বিবেচনায় থাকলে কেউ কোনও ধরণের ক্যাশে ব্যবহার করতে পারে তবে আমি এটি মোটেও একটি সমস্যা হওয়ার আশা করি না।

public static class Enum<T> where T : struct, IComparable, IFormattable, IConvertible
{
    // Lazily loaded
    static T[] values;
    static string[] names;

    public static IEnumerable<T> GetValues()
    {
        return values ?? (values = (T[])Enum.GetValues(typeof(T)));
    }

    public static IEnumerable<string> GetNames()
    {
        return names ?? (names = Enum.GetNames(typeof(T)));
    }
}

এটি পদ্ধতির একটি দুর্দান্ত সারসংক্ষেপ। আমি মনে করি আপনার অন্য উত্তরগুলি এতে মার্জ করা উচিত। সত্যটি হ'ল এনামটি বিশেষ এবং এগুলির মধ্য দিয়ে লুপিং প্রায়শই (সাধারণত) ঠিক গণনার মতোই বৈধ হয় কারণ আপনি জানেন যে মানগুলি কখনই পরিবর্তিত হয় না। আইওডাব্লু, আপনার যদি এমন কোনও এনাম থাকে যা সমস্ত সময় পরিবর্তন হয় তবে আপনি শুরু করতে ভুল ডেটা কনস্ট্রাক্টটি বেছে নিয়েছেন।
kroe2

31

কেবল শীর্ষস্থানীয় উত্তরগুলি একত্রিত করে আমি একটি খুব সাধারণ এক্সটেনশন একসাথে ছুঁড়েছি:

public static class EnumExtensions
{
    /// <summary>
    /// Gets all items for an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>(this T value) where T : Enum
    {
        return (T[])Enum.GetValues(typeof (T));
    }
}

এটি পরিষ্কার, সহজ এবং @ জেপ্পে-স্টিগ-নীলসেনের মন্তব্য দ্বারা, দ্রুত।


6
সি # 7.3 (ভিজ্যুয়াল স্টুডিও 2017 ≥ v15.7) দিয়ে শুরু করে, কেউ ব্যবহার করতে পারবেনwhere T: Enum
ইয়াহু সিরিয়াস

24

একটি পুনরাবৃত্তি করার দুটি উপায় আছে Enum:

1. var values =  Enum.GetValues(typeof(myenum))
2. var values =  Enum.GetNames(typeof(myenum))

প্রথমটি আপনাকে ** object** s এর অ্যারে আকারে মান দেয় এবং দ্বিতীয়টি আপনাকে ** String** s এর অ্যারের আকারে মান দেয় ।

এটি foreachনীচের মত একটি লুপ ব্যবহার করুন :

foreach(var value in values)
{
    // Do operations here
}

2
সম্ভবত 'কোস এটি ইতিমধ্যে অনেক উত্তরে coveredাকা আছে? আসুন উত্তরগুলি অনর্থক না করি।
নওফাল 17'17

@ নওফাল হ্যাঁ অন্যান্য উত্তরগুলিতে আচ্ছাদিত হতে পারে, যদিও তাদের বেশিরভাগের মধ্যেই ভাল সিদ্ধান্ত নেওয়া হয়নি।
কিলো রেন

23

আমি টসস্ট্রিং () এর পরে ফ্ল্যাগগুলিতে স্পিট অ্যারের বিভক্ত করে পার্স করব।

[Flags]
public enum ABC {
   a = 1,
   b = 2,
   c = 4
};

public IEnumerable<ABC> Getselected (ABC flags)
{
   var values = flags.ToString().Split(',');
   var enums = values.Select(x => (ABC)Enum.Parse(typeof(ABC), x.Trim()));
   return enums;
}

ABC temp= ABC.a | ABC.b;
var list = getSelected (temp);
foreach (var item in list)
{
   Console.WriteLine(item.ToString() + " ID=" + (int)item);
}

17

আমি মতামতটি রাখি না এটি ভাল, এমনকি ভাল। আমি কেবল আরও একটি সমাধান বলছি।

যদি এনাম মানগুলি 0 থেকে n - 1 পর্যন্ত কঠোরভাবে হয় তবে একটি জেনেরিক বিকল্প হ'ল:

public void EnumerateEnum<T>()
{
    int length = Enum.GetValues(typeof(T)).Length;
    for (var i = 0; i < length; i++)
    {
        var @enum = (T)(object)i;
    }
}

যদি এনাম মানগুলি সামঞ্জস্যপূর্ণ হয় এবং আপনি এনামের প্রথম এবং শেষ উপাদানটি সরবরাহ করতে পারেন তবে:

public void EnumerateEnum()
{
    for (var i = Suit.Spade; i <= Suit.Diamond; i++)
    {
        var @enum = i;
    }
}

তবে এটি কঠোরভাবে গণনা করা নয়, কেবল লুপিং। দ্বিতীয় পদ্ধতিটি অন্য যে কোনও পদ্ধতির চেয়ে অনেক দ্রুত ...


16

আপনার যদি বিল্ড এবং রান টাইমে স্পিড এবং টাইপ চেকিংয়ের প্রয়োজন হয় তবে প্রতিটি উপাদান castালতে লিনকিউ ব্যবহারের চেয়ে এই সহায়ক পদ্ধতিটি আরও ভাল:

public static T[] GetEnumValues<T>() where T : struct, IComparable, IFormattable, IConvertible
{
    if (typeof(T).BaseType != typeof(Enum))
    {
        throw new ArgumentException(string.Format("{0} is not of type System.Enum", typeof(T)));
    }
    return Enum.GetValues(typeof(T)) as T[];
}

এবং আপনি নীচের মত এটি ব্যবহার করতে পারেন:

static readonly YourEnum[] _values = GetEnumValues<YourEnum>();

অবশ্যই আপনি ফিরে আসতে পারেন IEnumerable<T>, কিন্তু এটি আপনাকে এখানে কিছুই কিনে না।


3
সি # 7.3 (ভিজ্যুয়াল স্টুডিও 2017 ≥ v15.7) দিয়ে শুরু করে, কেউ ব্যবহার করতে পারবেনwhere T: Enum
ইয়াহু সিরিয়াস

14

ডিডিএলের জন্য নির্বাচিত বিকল্পগুলি তৈরি করার একটি কার্যকরী উদাহরণ এখানে :

var resman = ViewModelResources.TimeFrame.ResourceManager;

ViewBag.TimeFrames = from MapOverlayTimeFrames timeFrame
      in Enum.GetValues(typeof(MapOverlayTimeFrames))
      select new SelectListItem
      {
         Value = timeFrame.ToString(),
         Text = resman.GetString(timeFrame.ToString()) ?? timeFrame.ToString()
      };

10
foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
}

(বর্তমান গৃহীত উত্তরের একটি কাস্ট রয়েছে যা আমি মনে করি না যে এটি প্রয়োজন হয় (যদিও আমি ভুল হতে পারি))


10

এই প্রশ্নটি " সি # পদক্ষেপে পদক্ষেপ 2013 এর 10 অধ্যায়ে উপস্থিত হবে " এর

একজোড়া গণক (কার্ডের একটি সম্পূর্ণ ডেক তৈরি করতে) এর মাধ্যমে পুনরাবৃত্তি করতে লেখক ডাবল ফর লুপ ব্যবহার করেন:

class Pack
{
    public const int NumSuits = 4;
    public const int CardsPerSuit = 13;
    private PlayingCard[,] cardPack;

    public Pack()
    {
        this.cardPack = new PlayingCard[NumSuits, CardsPerSuit];
        for (Suit suit = Suit.Clubs; suit <= Suit.Spades; suit++)
        {
            for (Value value = Value.Two; value <= Value.Ace; value++)
            {
                cardPack[(int)suit, (int)value] = new PlayingCard(suit, value);
            }
        }
    }
}

এই ক্ষেত্রে, Suitএবং Valueউভয়ই গণনা:

enum Suit { Clubs, Diamonds, Hearts, Spades }
enum Value { Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace}

এবং PlayingCardএকটি নির্ধারিত সঙ্গে একটি কার্ড অবজেক্ট Suitএবং Value:

class PlayingCard
{
    private readonly Suit suit;
    private readonly Value value;

    public PlayingCard(Suit s, Value v)
    {
        this.suit = s;
        this.value = v;
    }
}

এনামের মানগুলি অনুক্রমিক না হলে এই কাজ করবে?
আমির মাসউদ


8

আপনি যদি জানেন তবে টাইপটি একটি হবে enumতবে সংকলনের সময় সঠিক টাইপটি কী তা আপনি জানেন না ?

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

    public static IEnumerable getListOfEnum(Type type)
    {
        MethodInfo getValuesMethod = typeof(EnumHelper).GetMethod("GetValues").MakeGenericMethod(type);
        return (IEnumerable)getValuesMethod.Invoke(null, null);
    }
}

পদ্ধতিটি getListOfEnumকোনও এনাম প্রকার গ্রহণের জন্য প্রতিবিম্ব ব্যবহার করে এবং IEnumerableসমস্ত এনাম মানকে দেয়।

ব্যবহার:

Type myType = someEnumValue.GetType();

IEnumerable resultEnumerable = getListOfEnum(myType);

foreach (var item in resultEnumerable)
{
    Console.WriteLine(String.Format("Item: {0} Value: {1}",item.ToString(),(int)item));
}

8

এনামকে এমন কিছুতে রূপান্তর করার একটি সহজ এবং জেনেরিক উপায় যা আপনি ইন্টারেক্ট করতে পারেন:

public static Dictionary<int, string> ToList<T>() where T : struct
{
   return ((IEnumerable<T>)Enum
       .GetValues(typeof(T)))
       .ToDictionary(
           item => Convert.ToInt32(item),
           item => item.ToString());
}

এবং তারপর:

var enums = EnumHelper.ToList<MyEnum>();

Dictionaryএকটি ভাল ধারণা নয়: আপনার যদি Enumপছন্দ থাকে enum E { A = 0, B = 0 }তবে 0 টি মান উত্পন্ন ArgumentExceptionকরতে 2 বার যোগ করা হয় (আপনি Keyএটি Dictionary2 বা ততোধিক বারে যোগ করতে পারবেন না !)।
ম্যাসিমিলিয়ানো ক্রাউস

কেন একটি Dictionary<,>নাম পদ্ধতি থেকে একটি ফেরত ToList? এছাড়াও ফিরবে না কেন Dictionary<T, string>?
আলুয়ান হাদাদাদ

8

public static IEnumerable<T> GetValues<T>()আপনার ক্লাসে পদ্ধতি যুক্ত করুন , যেমন:

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

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

 public static void EnumerateAllSuitsDemoMethod()
 {
     // Custom method
     var foos = GetValues<Suit>();
     foreach (var foo in foos)
     {
         // Do something
     }
 }

2

enumপ্রকারগুলিকে "গণনা প্রকারগুলি" বলা হয় না কারণ এগুলি ধারক যেগুলি "গণনা" মানগুলি (যা তারা নয়), কিন্তু কারণ এই ধরণের ভেরিয়েবলের জন্য সম্ভাব্য মানগুলি গণনা করে সংজ্ঞায়িত করা হয় ।

(প্রকৃতপক্ষে, এটি এর চেয়ে কিছুটা জটিল - এনাম প্রকারগুলিকে একটি "অন্তর্নিহিত" পূর্ণসংখ্যার ধরণ বলে মনে করা হয়, যার অর্থ প্রতিটি এনাম মান একটি পূর্ণসংখ্যার মানের সাথে মিলিত হয় (এটি সাধারণত অন্তর্ভুক্ত, তবে ম্যানুয়ালি নির্দিষ্ট করা যেতে পারে) # সি # ডিজাইন করা হয়েছিল এমন কোনও উপায়ে যাতে আপনি যে কোনও জিনিস স্টাফ করতে পারেন পূর্ণসংখ্যাকে এনাম ভেরিয়েবলের মধ্যে , এমনকি যদি এটি "নামযুক্ত" মান না হয়))

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

সম্পাদনা: এর পরিবর্তে সিস্টেমটি.ইনাম.গ্যাটভ্যালু পদ্ধতিটি পরামর্শ দেওয়া উচিত ছিল । উফ।


2
যদিও আপনার উত্তরটি নিজেই সঠিক, তবে এটি ওপির আসল প্রশ্নটিকে সত্যিই সম্বোধন করে না। GetNamesপদ্ধতি আয় প্রকৃতপক্ষে, একটি স্ট্রিং অ্যারে, কিন্তু ওপি মান মাধ্যমে একটি গণনাকারী প্রয়োজন।
সিলভিউ প্রেদা 15'18

@ সিলভিউপ্রদা: সম্পাদিত। এটি গেটনামের পরিবর্তে গেটভ্যালু হওয়া উচিত ছিল।
এমিলি চেন

2

আমি অনেক উপায়ে চেষ্টা করেছি এবং এই কোড থেকে ফলাফল পেয়েছি:

এনাম থেকে ইনটেলের একটি তালিকা পাওয়ার জন্য, নিম্নলিখিতটি ব্যবহার করুন। এটি কাজ করে!

List<int> listEnumValues = new List<int>();
YourEnumType[] myEnumMembers = (YourEnumType[])Enum.GetValues(typeof(YourEnumType));
foreach ( YourEnumType enumMember in myEnumMembers)
{
    listEnumValues.Add(enumMember.GetHashCode());
}

1
@ পিটার-মর্টেনসেন সম্পাদনা করার জন্য টানেক্স
রেজা আখলাঝি

0

এছাড়াও আপনি সরাসরি প্রতিবিম্ব ব্যবহার করে এনামের পাবলিক স্থিতিশীল সদস্যদের কাছে আবদ্ধ করতে পারেন:

typeof(Suit).GetMembers(BindingFlags.Public | BindingFlags.Static)
    .ToList().ForEach(x => DoSomething(x.Name));

0

যদি তোমার থাকে:

enum Suit
{
   Spades,
   Hearts,
   Clubs,
   Diamonds
}

এই:

foreach (var e in Enum.GetValues(typeof(Suit)))
{
    Console.WriteLine(e.ToString() + " = " + (int)e);
}

আউটপুট দেবে:

Spades = 0
Hearts = 1
Clubs = 2
Diamonds = 3

0

লিনকিউ জেনেরিক উপায়:

    public static Dictionary<int, string> ToList<T>() where T : struct =>
        ((IEnumerable<T>)Enum.GetValues(typeof(T))).ToDictionary(value => Convert.ToInt32(value), value => value.ToString());

ব্যবহার:

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