এনামে সংজ্ঞায়িত আইটেমের মোট সংখ্যা


উত্তর:


430

আপনি স্থিতিশীল পদ্ধতিটি ব্যবহার করতে পারেন Enum.GetNamesযা এনামের সমস্ত আইটেমের নাম উপস্থাপন করে এমন অ্যারে প্রদান করে। এই অ্যারের দৈর্ঘ্যের বৈশিষ্ট্য এনামে সংজ্ঞায়িত আইটেমের সংখ্যার সমান

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;

1
সম্মত ... এখানে একটি লিঙ্ক আমি পেয়েছি csharp411.com/c-count-items-in-an-enum
সুতরাং ব্যবহারকারী

8
এনাম.গেটভ্যালুও ব্যবহার করতে পারে।
জোনাট্রন

6
সিস্টেম.ইনম.গেটনাম, যদি আপনি ইতিমধ্যে সিস্টেমের নাম স্থানটি অন্তর্ভুক্ত না করেন।
ব্রেট পেনিংস 3'15

4
তাই আমি আজ আবার এই সমস্যার মুখোমুখি হয়েছি; নীচের অন্যান্য উত্তরে বর্ণিত সি স্টাইলের কৌশলটিকে সমস্যাযুক্ত হিসাবে তালিকাভুক্ত করা হয়েছে তবে উপরে উল্লিখিত এনাম.গেটভ্যালিউস এবং এনাম.গেটনাম উভয়ই মনে হচ্ছে তারা ঠিক একটি নির্দিষ্ট দৈর্ঘ্য পেতে পুরো একটি নতুন অ্যারে বরাদ্দ করার ঝুঁকি নিয়েছে, যা মনে হয় ... ভাল ভয়াবহ। কেউ কি জানেন যে এই পদ্ধতির সত্যই গতিশীল বরাদ্দ ব্যয় হয়? যদি তা হয় তবে নির্দিষ্ট ব্যবহারের ক্ষেত্রে এটি সর্বাধিক নমনীয় না হলে সবচেয়ে পারফরম্যান্স সমাধানটি খুব দূরের এবং মনে হয়।
জে ট্রানা

174

প্রশ্ন হচ্ছে:

এনামে সংজ্ঞায়িত আইটেমের সংখ্যা আমি কীভাবে পেতে পারি?

"আইটেম" সংখ্যাটি সত্যই দুটি সম্পূর্ণ ভিন্ন জিনিস বোঝাতে পারে। নিম্নলিখিত উদাহরণ বিবেচনা করুন।

enum MyEnum
{
    A = 1,
    B = 2,
    C = 1,
    D = 3,
    E = 2
}

"আইটেম" সংখ্যায় কী সংজ্ঞায়িত হয় MyEnum?

আইটেমের সংখ্যা 5? ( A, B, C, D, E)

নাকি এটা 3? ( 1, 2, 3)

(5) এ সংজ্ঞায়িত নামের সংখ্যা MyEnumনিম্নরূপে গণনা করা যেতে পারে।

var namesCount = Enum.GetNames(typeof(MyEnum)).Length;

(3) এ সংজ্ঞায়িত মানগুলির সংখ্যা MyEnumনিম্নলিখিত হিসাবে গণনা করা যেতে পারে।

var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();

2
শেষ পংক্তিতে লেখার বিকল্প উপায় var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();,।
জেপ্প স্টিগ নীলসেন

3
আমি আমার জীবনে এমন কোনও বিকাশকারীর কথা ভাবতে পারি না যিনি নিশ্চিত হয়েছিলেন যে এই জাতীয় এনামে 3 টি আইটেম রয়েছে।
মোটোড্রিজ্ট

2
@motoDrizzt আপনি যেমন একটি প্রিন্টার ড্রাইভারের এনাম এ সন্ধান করতে পারেন Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...;)।
shA.t

স্বীকৃত উত্তর হওয়া উচিত
নীলস্কোবার


14

এই প্রশ্নের একটি সি উত্তরে একটি নিফটি ট্রিক আমি দেখেছি, এনামে কেবল একটি শেষ উপাদান যুক্ত করুন এবং এনুমে কতগুলি উপাদান রয়েছে তা জানাতে এটি ব্যবহার করুন:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

আপনি যেখানে 0 বাদে আরম্ভের মানটি সংজ্ঞায়িত করছেন সেখানে আপনি উপাদানগুলির সংখ্যা নির্ধারণের জন্য নাম্বার অফ টাইপ - টাইপ 1 ব্যবহার করতে পারেন।

আমি নিশ্চিত না যে এই পদ্ধতিটি এনুম ব্যবহারের চেয়ে দ্রুত হবে কিনা এবং আমি নিশ্চিত নই যে এটি করার উপযুক্ত উপায় হিসাবে বিবেচনা করা হবে কিনা, কারণ আমাদের কাছে এই তথ্য আমাদের কাছে নিশ্চিত করার জন্য এনুম রয়েছে।


1
এটি দুর্দান্ত কারণ আমি এক্সএনএ এ করতে পারি কারণ গেটনামগুলি সেখানে পাওয়া যায় না
থিয়াগো ভ্যালে

দুর্দান্ত কৌশল, এটি getNames () এর চেয়েও দ্রুত হবে কারণ এটি তাদের গণনা করতে হবে না।
জর্দান লাপ্রিস

4
ফরচ এর মাধ্যমে এনামগুলির মাধ্যমে চক্রের কোডটি সম্পর্কে সতর্ক থাকুন - আপনি আপনার অ্যারের শেষটি পড়তে পারেন!
মাইকেল ডারগান

4
এছাড়াও, এনামগুলি থেকে সাবধান থাকুন যা তাদের নিজস্ব মান নির্ধারণ করে - আমি প্রায়শই বিট ফ্ল্যাগের জন্য এনাম ব্যবহার করি use
ম্যাট পার্কিন্স 11


6

পূর্ববর্তী উত্তরগুলি থেকে কেবল কোড নমুনা যুক্ত করা।

 class Program
    {
        static void Main(string[] args)
        {
            int enumlen = Enum.GetNames(typeof(myenum)).Length;
            Console.Write(enumlen);
            Console.Read();
        }
        public enum myenum
        {
            value1,
            value2
        }
    }

5

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

গেটনামগুলি গেটভ্যালুগুলির মতো একই ফলাফল তৈরি করে তবে দ্রুত।


5

আপনি যদি আমার মতো প্রায়শই উপরের সমাধানটি লিখতে থাকেন তবে আপনি এটি জেনেরিক হিসাবে প্রয়োগ করতে পারেন:

public static int GetEnumEntries<T>() where T : struct, IConvertible 
{
    if (!typeof(T).IsEnum)
        throw new ArgumentException("T must be an enumerated type");

    return Enum.GetNames(typeof(T)).Length;
}

1

আমি এখনই এটি সন্ধান করছিলাম, এবং বর্তমান সমাধানের পাঠযোগ্যতার সাথে সন্তুষ্ট নই। আপনি যদি অনানুষ্ঠানিকভাবে বা কোনও ছোট প্রকল্পে কোড লিখছেন তবে আপনি আপনার এনামের শেষে "দৈর্ঘ্য" নামে অন্য একটি আইটেম যুক্ত করতে পারেন। এইভাবে, আপনাকে কেবল টাইপ করতে হবে:

var namesCount = (int)MyEnum.Length;

অবশ্যই যদি অন্যরা আপনার কোড ব্যবহার করে চলেছে - বা আমি নিশ্চিত যে আরও অনেক পরিস্থিতিতে আমার পক্ষে প্রযোজ্য না - তবে এই সমাধানটি অসুস্থ থেকে ভয়ঙ্কর পর্যন্ত পরামর্শ দেওয়া যে কোনও জায়গায় হতে পারে।


2
এটি 0 থেকে শুরু হওয়া এনামের উপরও নির্ভর করে (ডিফল্ট, তবে কোনওভাবেই গ্যারান্টিযুক্ত নয়)। অতিরিক্তভাবে, এটি এনামের স্বাভাবিক ব্যবহারের জন্য খুব বিভ্রান্তিকর করে তোলে । এটি প্রায় সর্বদা একটি ভয়ঙ্কর ধারণা।
ব্র্যাডলিডটনেট

2
এটি বেশি সময় নেয় নি :)
এনার্জিওয়াসআর

1
আকর্ষণীয়, আমি মনে করি আপনি কখনই জানেন না যে কখন আরও ভাল কিছু ঘটতে পারে। আমি আমার নিজের সমাধানটি সরিয়ে রাখার জন্য যথাসাধ্য চেষ্টা করেছি, তবে এটি ভাগ করে নেওয়ার পক্ষে যথেষ্ট আকর্ষণীয়!
এনার্জিওয়াসরো

1

ভিজ্যুয়াল বেসিকের জন্য:

[Enum].GetNames(typeof(MyEnum)).Lengthআমার সাথে কাজ করেনি, তবে [Enum].GetNames(GetType(Animal_Type)).lengthকরেছে।


ডাউনটা কেন? এটি আমার সমস্যার সমাধান করে, এটি ভিবি-র জন্য সঠিক সিনট্যাক্স, যদিও প্রশ্নটি সি # ট্যাগ করা রয়েছে, এখনও দরকারী।
এম গ্রানজা

2
ডাউনভোটস সম্ভবত প্রশ্নটি সি # ট্যাগ করেছে এবং এই উত্তরটি এটি সি # ব্যবহার করছে না বলে উল্লেখ করেছে।
ইডব্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.