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


99

আমি একটি সংজ্ঞায়িত করার Enumএবং সিএসভি বা অনুরূপ ফাইলগুলিতে ব্যবহৃত বৈধ সাধারণ বিভাজক যুক্ত করার চেষ্টা করছি । তারপরে আমি এটি ComboBoxএকটি ডেটা উত্স হিসাবে আবদ্ধ করতে যাচ্ছি তাই যখনই আমি এনাম সংজ্ঞাটি যুক্ত করব বা সরিয়ে ফেলব, আমার কম্বো বাক্সে কোনও পরিবর্তন করার দরকার পড়বে না।

সমস্যাটি হল আমি স্ট্রিং উপস্থাপনের সাথে এনামকে কীভাবে সংজ্ঞায়িত করতে পারি:

public enum SeparatorChars{Comma = ",", Tab = "\t", Space = " "}


উত্তর:


114

আপনি পারবেন না - এনাম মানগুলি অবিচ্ছেদ্য মান হতে হবে। আপনি প্রতিটি এনাম মানের সাথে একটি স্ট্রিং মান সংযুক্ত করতে বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন, বা এই ক্ষেত্রে যদি প্রতিটি বিভাজক একক অক্ষর হয় তবে আপনি কেবল charমানটি ব্যবহার করতে পারেন :

enum Separator
{
    Comma = ',',
    Tab = '\t',
    Space = ' '
}

(সম্পাদনা: কেবল পরিষ্কার করার জন্য, আপনি charএনামের অন্তর্নিহিত প্রকারটি তৈরি করতে পারবেন না , তবে charপ্রতিটি এনাম মানের সাথে সামঞ্জস্যপূর্ণ মান নির্ধারণের জন্য আপনি ধ্রুবকগুলি ব্যবহার করতে পারেন above উপরের এনামের অন্তর্নিহিত প্রকারটি int))

তারপরে আপনার যদি প্রয়োজন হয় তবে একটি এক্সটেনশন পদ্ধতি:

public string ToSeparatorString(this Separator separator)
{
    // TODO: validation
    return ((char) separator).ToString();
}

চর এনামগুলিতে বৈধ নয়। এমএসডিএন: "প্রতিটি অঙ্কের ধরণের একটি অন্তর্নিহিত ধরণ থাকে যা চর ছাড়া অন্য কোনও অবিচ্ছেদ্য প্রকার হতে পারে" "
ডুহাইল

9
@ ডাউইলিফোর: আপনি আমার উত্তর অনুসারে মানের জন্য চর অক্ষর ব্যবহার করতে পারেন । আমি এটি পরীক্ষা করেছি :)
জন স্কিটি

ফাইলগুলির জন্য এই প্রয়োজনীয়তা হিসাবে ব্যবহারকারীকে সিআরএলএফ বিভাজকের প্রয়োজন হতে পারে। এটি কি এই ক্ষেত্রে কাজ করবে?
মাহীপ

ধন্যবাদ জোন, একটি চর হিসাবে গণনা করা যায় না ?!
সাইদ ইয়াজদানি

4
@ শনলুটিন: এনামগুলি কেবল "নামযুক্ত নাম্বার" - সুতরাং একটি স্ট্রিং এনুম সেই মডেলটির সাথে মোটেও ফিট করে না।
জন স্কিটি

83

আমি যতদূর জানি, আপনাকে এনুমগুলিতে স্ট্রিংয়ের মান নির্ধারণের অনুমতি দেওয়া হবে না। আপনি যা করতে পারেন তা হল এতে স্ট্রিং ধ্রুবক সহ একটি বর্গ তৈরি করা।

public static class SeparatorChars
{
    public static String Comma { get { return ",";} } 
    public static String Tab { get { return "\t,";} } 
    public static String Space { get { return " ";} } 
}

10
অন্যদের বিরোধিতা করা এই পদ্ধতির নীচের দিকটি হ'ল আপনি অতিরিক্ত / বিশেষ কিছু না করে এগুলি গণনা করতে পারবেন না।
সিএসে

সংকলনের সময় এটি নির্দিষ্ট মানগুলিকে প্রয়োগ করতে সহায়তা করে না, যেহেতু separatorএখন Separatorসীমাবদ্ধ বৈধ মানগুলির সাথে টাইপের পরিবর্তে একটি স্ট্রিং (কিছু হতে পারে) is
চিকেনফিট

74

আপনি এটি অর্জন করতে পারেন তবে কিছুটা কাজের প্রয়োজন হবে।

  1. একটি এনট্রিবিউট শ্রেণীর সংজ্ঞা দিন যা এনুমের জন্য স্ট্রিংয়ের মান ধারণ করবে।
  2. একটি এক্সটেনশন পদ্ধতিটি নির্ধারণ করুন যা বৈশিষ্ট্য থেকে মানটি ফিরিয়ে দেবে। যেমন..গেটস্ট্রিংভ্যালু (এই এনাম মান) বৈশিষ্ট্যের মানটি ফেরত দেবে।
  3. তারপরে আপনি এনামটিকে এভাবে परिभाषित করতে পারেন ..
পাবলিক এনাম টেস্ট: int {
    [স্ট্রিংভ্যালু ("ক")]
    ফু = 1,
    [স্ট্রিংভ্যালু ("বি")]
    কিছু = 2        
} 
  1. অ্যাট্রিনবুট টেস্ট থেকে মূল্য ফিরে পেতে ooফু.গেটস্ট্রিংভ্যালু ();

রেফারেন্স : সি # তে স্ট্রিং মান সহ এনাম


6
আমি এই পুরাতনটি জানি তবে এটি স্পষ্টতই অনন্য এবং আপনাকে ডিবিতে কোড এবং স্ট্রিংয়ের মান হিসাবে এনামগুলি ব্যবহার করতে দেয়। আশ্চর্যজনক
এ_ক্যাট

4
আরেকটি দেরিতে মন্তব্য, তবে এটি সত্যই একটি উজ্জ্বল সমাধান
এ্যালান

37

স্ট্রিং মানগুলির একটি সহজ এনামের জন্য (বা অন্য কোনও ধরণের):

public static class MyEnumClass
{
    public const string 
        MyValue1 = "My value 1",
        MyValue2 = "My value 2";
}

ব্যবহার: string MyValue = MyEnumClass.MyValue1;


4
যদিও এটি কোনও এনাম নয়, তবে আমি মনে করি এটি ব্যবহারকারীর চেষ্টা করার সর্বোত্তম সমাধান সরবরাহ করতে পারে। কখনও কখনও, সহজ সমাধান সেরা।
জেস্টি

31

আপনি enums দিয়ে এটি করতে পারবেন না, তবে আপনি এটির মতো এটি করতে পারেন:

public static class SeparatorChars
{
    public static string Comma = ",";

    public static string Tab = "\t";

    public static string Space = " ";
}

4
+1 যদিও আমি মনে করি এটি সঠিক সমাধান, তবে আমি শ্রেণীর নাম পরিবর্তন করব বা টাইপটিকে অক্ষরে পরিবর্তন করব। শুধু ধারাবাহিক হতে।
ডুহাইল

ধন্যবাদ, আপনি কি বলতে পারেন comboBox.DataSource = Enum.GetValues(typeof(myEnum));এই ক্ষেত্রে সমতুল্য কি হবে ?
সাইদ ইয়াজদানি

4
@ শান::: আমি আপনার এটি পেতে চাই, আমি জোনস্কিটের উত্তর নেব।
ফিশারমেন

আমি মনে করি এটি প্রায় সঠিক উত্তর, কারণ এটি switch-caseব্লকের ভিতরে ব্যবহারযোগ্য নয় not ক্ষেত্রগুলি constযাতে করতে হবে। তবে আপনি চাইলে এটি এখনও সহায়তা করা যায় না Enum.GetValues(typeof(myEnum))
আন্দ্রে সাঁওতাল

7
আমি constপরিবর্তে ব্যবহার করতে হবে static। ধ্রুবকগুলি কেবল পঠনযোগ্য পাশাপাশি স্থির এবং কনস্ট্রাক্টরগুলিতে (কেবল পঠিত ক্ষেত্রগুলি ব্যতীত) তেমন দর্শনীয় নয়।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

12

আপনি পারবেন না, কারণ এনাম কেবলমাত্র একটি প্রাথমিক সংখ্যার প্রকারের ভিত্তিতে তৈরি হতে পারে। Dictionaryপরিবর্তে আপনি চেষ্টা করতে পারেন :

Dictionary<String, char> separators = new Dictionary<string, char>
{
    {"Comma", ','}, 
    {"Tab",  '\t'}, 
    {"Space", ' '},
};

বিকল্পভাবে, আপনি এমন একটি ব্যবহার করতে পারেন যেখানে Dictionary<Separator, char>বা একটি সাধারণ এনাম:Dictionary<Separator, string>Separator

enum Separator
{
    Comma,
    Tab,
    Space
}

যা সরাসরি স্ট্রিংগুলি পরিচালনা করার চেয়ে কিছুটা আনন্দদায়ক হবে।


12

একটি শ্রেণি যা এনাম আচরণ অনুকরণ করে তবে stringপরিবর্তে ব্যবহার করে intতা তৈরি করা যেতে পারে ...

public class GrainType
{
    private string _typeKeyWord;

    private GrainType(string typeKeyWord)
    {
        _typeKeyWord = typeKeyWord;
    }

    public override string ToString()
    {
        return _typeKeyWord;
    }

    public static GrainType Wheat = new GrainType("GT_WHEAT");
    public static GrainType Corn = new GrainType("GT_CORN");
    public static GrainType Rice = new GrainType("GT_RICE");
    public static GrainType Barley = new GrainType("GT_BARLEY");

}

ব্যবহার ...

GrainType myGrain = GrainType.Wheat;

PrintGrainKeyword(myGrain);

তাহলে ...

public void PrintGrainKeyword(GrainType grain) 
{
    Console.Writeline("My Grain code is " + grain.ToString());   // Displays "My Grain code is GT_WHEAT"
}

GrainType myGrain = "GT_CORN"উদাহরণস্বরূপ, কেবলমাত্র আপনি যা করতে পারবেন না ।
কলম্বে

4
আপনি যদি অপারেটরটিকে ছাড়িয়ে যান
এসএসএক্স-এসএল

10

উত্তরের জন্য এটি দেরি হয়ে গেছে তবে এটি ভবিষ্যতে কাউকে সহায়তা করতে পারে। এই ধরণের সমস্যার জন্য কাঠামো ব্যবহার করা আমার পক্ষে আরও সহজ মনে হয়েছে।

নিম্নলিখিত নমুনাটি এমএস কোড থেকে অংশটি অনুলিপি করা হয়েছে:

namespace System.IdentityModel.Tokens.Jwt
{
    //
    // Summary:
    //     List of registered claims from different sources http://tools.ietf.org/html/rfc7519#section-4
    //     http://openid.net/specs/openid-connect-core-1_0.html#IDToken
    public struct JwtRegisteredClaimNames
    {
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Actort = "actort";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Typ = "typ";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Sub = "sub";
        //
        // Summary:
        //     http://openid.net/specs/openid-connect-frontchannel-1_0.html#OPLogout
        public const string Sid = "sid";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Prn = "prn";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Nbf = "nbf";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string Nonce = "nonce";
        //
        // Summary:
        //     http://tools.ietf.org/html/rfc7519#section-4
        public const string NameId = "nameid";

    }
}

আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এই অ্যাপ্রোচটি ক্লাস ব্যবহারের চেয়ে ভাল?
জেরার্ডো গ্রিগনোলি

@ জেরার্ডো গ্রিগনলি আমি ঠিক জানি না যে তারা এই জাতীয় জিনিসের জন্য এমএসে ক্লাসের পরিবর্তে স্ট্রাক্ট কেন ব্যবহার করে। এমনকি আমি এটি চেষ্টা করার চেষ্টাও করিনি, কারণ এটি আমার পক্ষে নিখুঁতভাবে কাজ করছে working হয়ত এখানে স্ট্যাকের জন্য প্রশ্ন জিজ্ঞাসা করার চেষ্টা করুন ...
যেমন

8

হয়তো অনেক দেরি হয়ে গেছে, কিন্তু এখানে চলে গেছে।

আমরা এনুম মানগুলি পরিচালনা করতে এনামমেম্বার বৈশিষ্ট্যটি ব্যবহার করতে পারি।

public enum EUnitOfMeasure
{
    [EnumMember(Value = "KM")]
    Kilometer,
    [EnumMember(Value = "MI")]
    Miles
}

এইভাবে EUnitOfMeasure এর ফলাফলের মানটি কেএম বা এমআই হবে। এটাও অ্যান্ড্রু হুইটেকার দেখা যায় উত্তর


5

আরও সাধারণ জবাবের সন্ধানের জন্য এখানে পৌঁছে যাওয়া লোকের জন্য, আপনি যদি নিজের কোডটির মতো দেখতে চান তবে আপনি স্থির শ্রেণীর ধারণাটি প্রসারিত করতে পারেন enum

আপনি যেটি enum namesচান তা চূড়ান্ত করেন নি এবং enum valuesনিম্নলিখিতটি stringউপস্থাপিত হলে নীচের পদ্ধতিটি কার্যকর হয় enam name; nameof()আপনার রিফ্যাক্টরিং সহজ করতে ব্যবহার করুন ।

public static class Colours
{
    public static string Red => nameof(Red);
    public static string Green => nameof(Green);
    public static string Blue => nameof(Blue);
}

এটি এমন এনামের উদ্দেশ্য অর্জন করে যার স্ট্রিংয়ের মান রয়েছে (যেমন নীচের সিউডোকোড):

public enum Colours
{
    "Red",
    "Green",
    "Blue"
}

4

.NET এ স্ট্রিং-মানযুক্ত এনাম তৈরির জন্য আমি একটি বেস ক্লাস তৈরি করেছি। এটি কেবলমাত্র একটি সি # ফাইল যা আপনি আপনার প্রকল্পগুলিতে অনুলিপি এবং আটকান করতে পারেন, বা স্ট্রিংইনাম নামের নিউগেট প্যাকেজটির মাধ্যমে ইনস্টল করতে পারেন ।

ব্যবহার:

///<completionlist cref="HexColor"/> 
class HexColor : StringEnum<HexColor>
{
    public static readonly HexColor Blue = New("#FF0000");
    public static readonly HexColor Green = New("#00FF00");
    public static readonly HexColor Red = New("#000FF");
}

বৈশিষ্ট্য

  • আপনার স্ট্রিংইনাম কিছুটা নিয়মিত এনামের সাথে মিল দেখায়:
    // Static Parse Method
    HexColor.Parse("#FF0000") // => HexColor.Red
    HexColor.Parse("#ff0000", caseSensitive: false) // => HexColor.Red
    HexColor.Parse("invalid") // => throws InvalidOperationException

    // Static TryParse method.
    HexColor.TryParse("#FF0000") // => HexColor.Red
    HexColor.TryParse("#ff0000", caseSensitive: false) // => HexColor.Red
    HexColor.TryParse("invalid") // => null

    // Parse and TryParse returns the preexistent instances
    object.ReferenceEquals(HexColor.Parse("#FF0000"), HexColor.Red) // => true

    // Conversion from your `StringEnum` to `string`
    string myString1 = HexColor.Red.ToString(); // => "#FF0000"
    string myString2 = HexColor.Red; // => "#FF0000" (implicit cast)
  • ক্লাসটি যদি এক্সএমএল মন্তব্যে টীকাযুক্ত করা হয় তবে ইনটেলিসেন্স এনামের নাম প্রস্তাব করবে <completitionlist>। (সি # এবং ভিবি উভয় ক্ষেত্রেই কাজ করে): অর্থাৎ

ইন্টেলিজেন্স ডেমো

ইনস্টলেশন

হয়:

  • সর্বশেষ ইনস্টল করুন StringEnum NuGet প্যাকেজ, যার উপর ভিত্তি করে তৈরি .Net Standard 1.0তাই এটি উপর সঞ্চালিত হয় .Net Core> = 1.0, .Net Framework> = 4.5, Mono> = 4.6, ইত্যাদি
  • বা আপনার প্রকল্পে নিম্নলিখিত স্ট্রিংইনম বেস ক্লাসটি পেস্ট করুন। ( সর্বশেষ সংস্করণ )
    public abstract class StringEnum<T> : IEquatable<T> where T : StringEnum<T>, new()
    {
        protected string Value;
        private static IList<T> valueList = new List<T>();
        protected static T New(string value)
        {
            if (value == null)
                return null; // the null-valued instance is null.

            var result = new T() { Value = value };
            valueList.Add(result);
            return result;
        }

        public static implicit operator string(StringEnum<T> enumValue) => enumValue.Value;
        public override string ToString() => Value;

        public static bool operator !=(StringEnum<T> o1, StringEnum<T> o2) => o1?.Value != o2?.Value;
        public static bool operator ==(StringEnum<T> o1, StringEnum<T> o2) => o1?.Value == o2?.Value;

        public override bool Equals(object other) => this.Value.Equals((other as T)?.Value ?? (other as string));
        bool IEquatable<T>.Equals(T other) => this.Value.Equals(other.Value);
        public override int GetHashCode() => Value.GetHashCode();

        /// <summary>
        /// Parse the <paramref name="value"/> specified and returns a valid <typeparamref name="T"/> or else throws InvalidOperationException.
        /// </summary>
        /// <param name="value">The string value representad by an instance of <typeparamref name="T"/>. Matches by string value, not by the member name.</param>
        /// <param name="caseSensitive">If true, the strings must match case sensitivity.</param>
        public static T Parse(string value, bool caseSensitive = false)
        {
            var result = TryParse(value, caseSensitive);
            if (result == null)
                throw new InvalidOperationException((value == null ? "null" : $"'{value}'") + $" is not a valid {typeof(T).Name}");

            return result;
        }

        /// <summary>
        /// Parse the <paramref name="value"/> specified and returns a valid <typeparamref name="T"/> or else returns null.
        /// </summary>
        /// <param name="value">The string value representad by an instance of <typeparamref name="T"/>. Matches by string value, not by the member name.</param>
        /// <param name="caseSensitive">If true, the strings must match case sensitivity.</param>
        public static T TryParse(string value, bool caseSensitive = false)
        {
            if (value == null) return null;
            if (valueList.Count == 0) System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle); // force static fields initialization
            var field = valueList.FirstOrDefault(f => f.Value.Equals(value,
                    caseSensitive ? StringComparison.Ordinal
                                  : StringComparison.OrdinalIgnoreCase));
            // Not using InvariantCulture because it's only supported in NETStandard >= 2.0

            if (field == null)
                return null;

            return field;
        }
    }
  • জন্য Newtonsoft.Jsonধারাবাহিকতাতে সমর্থন, পরিবর্তে এই বর্ধিত সংস্করণ কপি করুন। স্ট্রিংইনম। সি

আমি বুঝতে পেরেছিলাম যে এই কোডটি বেনের উত্তরের মতো। আমি আন্তরিকভাবে এটি স্ক্র্যাচ থেকে লিখেছি। তবে আমি মনে করি এটিতে <completitionlist>হ্যাকের মতো কয়েকটি অতিরিক্ত রয়েছে, ফলস্বরূপ শ্রেণিটি আরও এনামের মতো দেখায়, পার্সে () পার্সে) এর প্রতিফলনের কোনও ব্যবহার নেই, নুগেট প্যাকেজ এবং রেপো যেখানে আমি প্রত্যাশিতভাবে আগত সমস্যাগুলি এবং প্রতিক্রিয়াগুলি সমাধান করব।


3

এখানে কয়েকটি উত্তরের ভিত্তিতে আমি একটি পুনরায় ব্যবহারযোগ্য বেস শ্রেণি প্রয়োগ করেছি যা এনামের আচরণের নকল করে তবে stringঅন্তর্নিহিত ধরণের হিসাবে। এটি সহ বিভিন্ন অপারেশন সমর্থন করে:

  1. সম্ভাব্য মানগুলির একটি তালিকা পেয়ে
  2. স্ট্রিং রূপান্তর
  3. অন্যান্য দৃষ্টান্ত সঙ্গে তুলনা মাধ্যমে .Equals, ==এবং!=
  4. JSON.NET JsonConverter ব্যবহার করে JSON এ / থেকে রূপান্তর

এটি সম্পূর্ণরূপে বেস শ্রেণি:

public abstract class StringEnumBase<T> : IEquatable<T>
    where T : StringEnumBase<T>
{
    public string Value { get; }

    protected StringEnumBase(string value) => this.Value = value;

    public override string ToString() => this.Value;

    public static List<T> AsList()
    {
        return typeof(T)
            .GetProperties(BindingFlags.Public | BindingFlags.Static)
            .Where(p => p.PropertyType == typeof(T))
            .Select(p => (T)p.GetValue(null))
            .ToList();
    }

    public static T Parse(string value)
    {
        List<T> all = AsList();

        if (!all.Any(a => a.Value == value))
            throw new InvalidOperationException($"\"{value}\" is not a valid value for the type {typeof(T).Name}");

        return all.Single(a => a.Value == value);
    }

    public bool Equals(T other)
    {
        if (other == null) return false;
        return this.Value == other?.Value;
    }

    public override bool Equals(object obj)
    {
        if (obj == null) return false;
        if (obj is T other) return this.Equals(other);
        return false;
    }

    public override int GetHashCode() => this.Value.GetHashCode();

    public static bool operator ==(StringEnumBase<T> a, StringEnumBase<T> b) => a?.Equals(b) ?? false;

    public static bool operator !=(StringEnumBase<T> a, StringEnumBase<T> b) => !(a?.Equals(b) ?? false);

    public class JsonConverter<T> : Newtonsoft.Json.JsonConverter
        where T : StringEnumBase<T>
    {
        public override bool CanRead => true;

        public override bool CanWrite => true;

        public override bool CanConvert(Type objectType) => ImplementsGeneric(objectType, typeof(StringEnumBase<>));

        private static bool ImplementsGeneric(Type type, Type generic)
        {
            while (type != null)
            {
                if (type.IsGenericType && type.GetGenericTypeDefinition() == generic)
                    return true;

                type = type.BaseType;
            }

            return false;
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JToken item = JToken.Load(reader);
            string value = item.Value<string>();
            return StringEnumBase<T>.Parse(value);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value is StringEnumBase<T> v)
                JToken.FromObject(v.Value).WriteTo(writer);
        }
    }
}

এবং এভাবেই আপনি আপনার "স্ট্রিং এনাম" প্রয়োগ করবেন:

[JsonConverter(typeof(JsonConverter<Colour>))]
public class Colour : StringEnumBase<Colour>
{
    private Colour(string value) : base(value) { }

    public static Colour Red => new Colour("red");
    public static Colour Green => new Colour("green");
    public static Colour Blue => new Colour("blue");
}

যা এর মতো ব্যবহার করা যেতে পারে:

public class Foo
{
    public Colour colour { get; }

    public Foo(Colour colour) => this.colour = colour;

    public bool Bar()
    {
        if (this.colour == Colour.Red || this.colour == Colour.Blue)
            return true;
        else
            return false;
    }
}

আমি আশা করি কেউ এই দরকারী খুঁজে পেয়েছে!


2

ভাল আপনি প্রথমে অক্ষরগুলি অক্ষরের সাথে চেষ্টা করার চেষ্টা করুন, এমনকি যদি সেগুলি কেবল একটি অক্ষর হয়। "," এর পরিবর্তে ',' ব্যবহার করুন। পরের বিষয়টি হল, charইউনিকোড মানটি ব্যবহার না করতে পারলে এনামগুলি কেবলমাত্র অবিচ্ছেদ্য প্রকারগুলি গ্রহণ করে , তবে আমি আপনাকে দৃ strongly়ভাবে পরামর্শ দিচ্ছি যাতে এটি না করা। আপনি যদি নিশ্চিত হন যে এই মানগুলি একই রকম থাকে, পৃথক সংস্কৃতি এবং ভাষায়, আমি কনস্ট্রিং স্ট্রিং সহ একটি স্ট্যাটিক ক্লাস ব্যবহার করব।


2

যদিও এনামের ভিত্তি হিসাবে একটি charবা একটি ব্যবহার করা সত্যিই সম্ভব নয় string, তবে আমি মনে করি এটি আপনি যা করতে চান তা ঠিক নয়।

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

প্রথমে আমাদের কিছু স্ট্রিং একটি এনাম মানের সাথে যুক্ত করতে হবে। এটি এখানে বা এখানেDescriptionAttribute বর্ণিত মত ব্যবহার করেই করা যেতে পারে ।

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

/// <summary>
/// Creates an List with all keys and values of a given Enum class
/// </summary>
/// <typeparam name="T">Must be derived from class Enum!</typeparam>
/// <returns>A list of KeyValuePair&lt;Enum, string&gt; with all available
/// names and values of the given Enum.</returns>
public static IList<KeyValuePair<T, string>> ToList<T>() where T : struct
{
    var type = typeof(T);

    if (!type.IsEnum)
    {
        throw new ArgumentException("T must be an enum");
    }

    return (IList<KeyValuePair<T, string>>)
            Enum.GetValues(type)
                .OfType<T>()
                .Select(e =>
                {
                    var asEnum = (Enum)Convert.ChangeType(e, typeof(Enum));
                    return new KeyValuePair<T, string>(e, asEnum.Description());
                })
                .ToArray();
}

এখন আপনার কাছে সমস্ত এনামের মূল মান জোড়া এবং তাদের বিবরণ রয়েছে। সুতরাং আসুন সহজভাবে এটি একটি কম্বো বাক্সের জন্য ডেটা উত্স হিসাবে নির্ধারণ করুন।

var comboBox = new ComboBox();
comboBox.ValueMember = "Key"
comboBox.DisplayMember = "Value";
comboBox.DataSource = EnumUtilities.ToList<Separator>();

comboBox.SelectedIndexChanged += (sender, e) =>
{
    var selectedEnum = (Separator)comboBox.SelectedValue;
    MessageBox.Show(selectedEnum.ToString());
}

ব্যবহারকারী এনামের সমস্ত স্ট্রিং উপস্থাপনা দেখে এবং আপনার কোডের মধ্যে আপনি পছন্দসই এনাম মান পাবেন।


0

স্ট্রিং প্রকার হিসাবে আমরা গণনার সংজ্ঞা দিতে পারি না। এনামের জন্য অনুমোদিত প্রকারগুলি হ'ল বাইট, এসবিট, শর্ট, ইউহোর্ট, ইনট, ইউন্ট, লম্বা বা উলং।

আপনার যদি গণনার বিষয়ে আরও বিশদ প্রয়োজন হয় দয়া করে নীচের লিঙ্কটি অনুসরণ করুন, সেই লিঙ্কটি আপনাকে গণনা বুঝতে সহায়তা করবে। গণনা

@ narendras1414


0

এটা আমার জন্য কাজ করে..

   public class ShapeTypes
    {
        private ShapeTypes() { }
        public static string OVAL
        {
            get
            {
                return "ov";
            }
            private set { }
        }

        public static string SQUARE
        {
            get
            {
                return "sq";
            }
            private set { }
        }

        public static string RECTANGLE
        {
            get
            {
                return "rec";
            }
            private set { }
        }
    }

0

আমি সম্প্রতি যা করতে শুরু করেছি তা হ'ল টিউপলস ব্যবহার করা

public static (string Fox, string Rabbit, string Horse) Animals = ("Fox", "Rabbit", "Horse");
...
public static (string Comma, string Tab, string Space) SeparatorChars = (",", "\t", " ");

-1

এনুমুলেশন ক্লাস

 public sealed class GenericDateTimeFormatType
    {

        public static readonly GenericDateTimeFormatType Format1 = new GenericDateTimeFormatType("dd-MM-YYYY");
        public static readonly GenericDateTimeFormatType Format2 = new GenericDateTimeFormatType("dd-MMM-YYYY");

        private GenericDateTimeFormatType(string Format)
        {
            _Value = Format;
        }

        public string _Value { get; private set; }
    }

এনামুলেশন কনসপশন

public static void Main()
{
       Country A = new Country();

       A.DefaultDateFormat = GenericDateTimeFormatType.Format1;

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