আপনি সি # তে একাধিক এনাম মান কীভাবে পাস করবেন?


117

কখনও কখনও অন্যের সি # কোড পড়ার সময় আমি এমন একটি পদ্ধতি দেখি যা একক প্যারামিটারে একাধিক এনাম মান গ্রহণ করবে। আমি সবসময় ভাবতাম এটি একরকম ঝরঝরে, তবে কখনই এটিতে তাকাতে হয়নি।

ঠিক আছে, এখন আমি মনে করি এটির জন্য আমার একটি প্রয়োজন থাকতে পারে তবে কীভাবে তা জানেন না

  1. এটি স্বীকার করার জন্য পদ্ধতি স্বাক্ষর সেট আপ করুন
  2. পদ্ধতিতে মানগুলি নিয়ে কাজ করুন
  3. এনাম সংজ্ঞায়িত

এই ধরণের জিনিস অর্জন।


আমার বিশেষ পরিস্থিতিতে আমি সিস্টেমটি ব্যবহার করতে চাই ayডাইঅফউইক, যা সংজ্ঞায়িত হয়েছে:

[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{ 
    Sunday = 0,   
    Monday = 1,   
    Tuesday = 2,   
    Wednesday = 3,   
    Thursday = 4,   
    Friday = 5,    
    Saturday = 6
}

আমি আমার পদ্ধতিতে ডেওঅফিউইক মানগুলির এক বা একাধিক পাস করতে সক্ষম হতে চাই। আমি কি এই বিশেষ এনামটিকে যেমন ব্যবহার করতে সক্ষম হবো? আমি উপরে তালিকাভুক্ত 3 টি জিনিস কীভাবে করব?


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

উত্তর:


181

আপনি যখন এনামটিকে সংজ্ঞায়িত করেন, কেবল [পতাকাগুলি] দিয়ে এটিটিকে বিশিষ্ট করুন, দুটিটির শক্তির মান নির্ধারণ করুন এবং এটি এভাবে কাজ করবে।

ফাংশনে একাধিক মান পাস করা ছাড়া আর কিছুই পরিবর্তন হয় না।

উদাহরণ স্বরূপ:

[Flags]
enum DaysOfWeek
{
   Sunday = 1,
   Monday = 2,
   Tuesday = 4,
   Wednesday = 8,
   Thursday = 16,
   Friday = 32,
   Saturday = 64
}

public void RunOnDays(DaysOfWeek days)
{
   bool isTuesdaySet = (days & DaysOfWeek.Tuesday) == DaysOfWeek.Tuesday;

   if (isTuesdaySet)
      //...
   // Do your work here..
}

public void CallMethodWithTuesdayAndThursday()
{
    this.RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
}

আরও বিশদের জন্য, গণনার প্রকারভেদে এমএসডিএন এর ডকুমেন্টেশন দেখুন ।


প্রশ্নের সংযোজনের জবাবে সম্পাদনা করুন।

আপনি সেই এনামটিকে সেভাবে ব্যবহার করতে পারবেন না, যদি না আপনি এটি অ্যারে / সংগ্রহ / প্যারাম অ্যারে হিসাবে পাস করার মতো কিছু করতে চান। এটি আপনাকে একাধিক মান পাস করতে দেয়। পতাকা সিনট্যাক্সের জন্য এনামকে পতাকা হিসাবে নির্দিষ্ট করা প্রয়োজন (বা ভাষাটি এমনভাবে উপস্থাপন করা উচিত যা এটি নকশাকৃত নয়)।


9
আমি মনে করি আপনি যদি এটি কাজ করতে চান তবে মানগুলিকে দুটি শক্তির হিসাবে সংজ্ঞা দেওয়া দরকার, প্রতিটি মানের জন্য একক বিট। যা হয় তা হ'ল আপনি প্যারামিটারের বিটওয়াইস বা মানগুলির মধ্যে পাস করে যা বিটওয়াইস এবং ক্রিয়াকলাপগুলি ব্যবহার করে পরীক্ষা করতে পারেন। উদাহরণস্বরূপ, 1,2,4,8 ইত্যাদি হিসাবে মানগুলি সংজ্ঞায়িত করার ক্ষেত্রে যত্ন না নিলে আপনার সমস্যা হবে।
ডেনিস ট্রোলার

1
কেবলমাত্র ফ্ল্যাগের অ্যাট্রিবিউট সেট করা স্বয়ংক্রিয়ভাবে কাজ করে না। আমি এটি চেষ্টা করেছিলাম।
রিচার্ড অ্যান্টনি হেইন

1
আপনি ঠিক বলেছেন, এবং আমি ভুল তথ্য সরিয়েছি। রিডের কোডটিও তার জন্য ঠিক করা।
ম্যাথু শার্লে

@ মোম অক্সাইড: আমি একই সময়ে এটি স্থির করে দিয়েছি - আপনার সম্পাদনাগুলি অগ্রাহ্য করার জন্য দুঃখিত।
রিড কোপসি

2
কোনও সমস্যা নেই ... আমি এখনও পতাকাটির মানগুলির জন্য হেক্স ব্যবহার করা পছন্দ করি, এটি আমার কাছে আরও স্পষ্ট মনে হয় তবে প্রতিটি তার নিজের কাছে।
ম্যাথু শার্লে

78

আমি মনে করি যে আরও মার্জিত সমাধান হ্যাসফ্ল্যাগ () ব্যবহার করা:

    [Flags]
    public enum DaysOfWeek
    {
        Sunday = 1,
        Monday = 2,
        Tuesday = 4,
        Wednesday = 8,
        Thursday = 16,
        Friday = 32,
        Saturday = 64
    }

    public void RunOnDays(DaysOfWeek days)
    {
        bool isTuesdaySet = days.HasFlag(DaysOfWeek.Tuesday);

        if (isTuesdaySet)
        {
            //...
        }
    }

    public void CallMethodWithTuesdayAndThursday()
    {
        RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
    }

এখানে আরও একটি গুরুত্বপূর্ণ বিষয় রয়েছে যা আপনি যদি এভাবে করেন তবে এটি যখন আপনার এনামকে গতিশীলভাবে পূরণ করার দরকার হয় তখন এটি আরও অনেক নমনীয়তা যুক্ত করে। উদাহরণস্বরূপ: আপনি যদি দিনগুলি নির্ধারণ করতে চেকবক্সগুলি ব্যবহার করেন, যার উপর আপনি আপনার প্রোগ্রামটি চালাতে চান এবং আপনি এটির উপরের পদ্ধতিতে এটি সম্পাদন করার চেষ্টা করবেন, কোডটি অপঠনযোগ্য হবে। সুতরাং পরিবর্তে আপনি এটি এইভাবে করতে পারেন: ... DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;...
কোস্টএন

25

আমি দ্বিতীয় রিডের উত্তর। যাইহোক, এনাম তৈরি করার সময়, আপনাকে অবশ্যই প্রতিটি এনাম সদস্যের জন্য মানগুলি নির্দিষ্ট করতে হবে যাতে এটি এক ধরণের বিট ক্ষেত্র তৈরি করে। উদাহরণ স্বরূপ:

[Flags]
public enum DaysOfWeek
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64,

    None = 0,
    All = Weekdays | Weekend,
    Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday,
    Weekend = Sunday | Saturday,
    // etc.
}

1
আপনার যদি কখনও ডেয়েসওউফ উইকের মূল্য পরীক্ষা করতে হয় তবে এটি আপনাকে সহায়তা করবে, উদাহরণস্বরূপ, যদি আপনি কোনও ডাটাবেজে সঞ্চিত একটি পড়ছেন reading এছাড়াও, এটি অন্যান্য প্রোগ্রামারদের আরও ভাল ডকুমেন্টেশন সরবরাহ করে, যেহেতু সপ্তাহের কয়েকটি গণ্য দিনগুলি রবিবারের পরিবর্তে সোমবার থেকে শুরু হয়।
জ্যাকব

3
স্পষ্টতা এবং রক্ষণাবেক্ষণের জন্য, আমি আপনার 'সমস্ত' এনামটি "রবিবার | সোমবার | মঙ্গলবার | বুধবার | বৃহস্পতিবার | শুক্রবার | শনিবার" "হিসাবে লিখব ... এবং 'সাপ্তাহিক দিবস' এবং 'উইকএন্ড' এর জন্য অনুরূপ স্বরলিপি ব্যবহার করব।
রবার্ট কার্টেইনো

আপনি যদি নিজের এনাম তৈরি করতে চান তবে এটি ঠিক আছে, তবে প্রশ্নের উত্তর দিতে আপনি বিদ্যমান দিনগুলি পরিবর্তন করতে পারবেন না
রবার্ট পলসন

2
"চাই" না ... আপনি আবশ্যক। বিটওয়াইজ তুলনা এটির প্রয়োজন। অনির্ধারিত মানগুলি রেখে যাওয়া কার্যকর হবে না।
রিচার্ড অ্যান্টনি হেইন

11

আমার বিশেষ পরিস্থিতিতে আমি সিস্টেমটি ব্যবহার করতে চাই ayডাইঅফউইক

আপনি [Flags]গণনা হিসাবে সিস্টেমটি ব্যবহার করতে পারবেন না ayডাইফউইক কারণ এটির উপর আপনার কোনও নিয়ন্ত্রণ নেই। আপনি যদি এমন কোনও পদ্ধতি চান যা একাধিক গ্রহণ করে DayOfWeekতবে আপনাকে paramsকীওয়ার্ডটি ব্যবহার করতে হবে

void SetDays(params DayOfWeek[] daysToSet)
{
    if (daysToSet == null || !daysToSet.Any())
        throw new ArgumentNullException("daysToSet");

    foreach (DayOfWeek day in daysToSet)
    {
        // if( day == DayOfWeek.Monday ) etc ....
    }
}

SetDays( DayOfWeek.Monday, DayOfWeek.Sunday );

অন্যথায় আপনি [Flags]অসংখ্য অন্যান্য প্রতিক্রিয়াকারীদের দ্বারা বর্ণিত হিসাবে নিজের অঙ্কটি তৈরি করতে পারেন এবং বিটওয়াইজ তুলনা ব্যবহার করতে পারেন।


2
কেন জানি আমি প্যারামের কথা ভাবিনি। বিটফিল্ড নয় এমন এনাম ব্যবহারের জন্য এটি খুব কার্যকর হওয়া উচিত।
রনি ওভারবি

10
[Flags]
public enum DaysOfWeek
{
  Mon = 1,
  Tue = 2,
  Wed = 4,
  Thur = 8,
  Fri = 16,
  Sat = 32,
  Sun = 64
}

আপনাকে নম্বরগুলি নির্দিষ্ট করতে হবে এবং এগুলিকে বাড়িয়ে দিতে হবে কারণ এটি মানগুলি কিছুটা ফ্যাশনে সঞ্চয় করে চলেছে।

তারপরে এই এনামটি নেওয়ার জন্য কেবল আপনার পদ্ধতিটি নির্ধারণ করুন

public void DoSomething(DaysOfWeek day)
{
  ...
}

এবং এটিকে কিছু করার মতো বলুন

DoSomething(DaysOfWeek.Mon | DaysOfWeek.Tue) // Both Monday and Tuesday

এনাম মানগুলির মধ্যে একটি অন্তর্ভুক্ত ছিল কিনা তা পরীক্ষা করার জন্য বিটওয়াইড অপারেশনগুলি ব্যবহার করে তাদের পরীক্ষা করে দেখুন check

public void DoSomething(DaysOfWeek day)
{
  if ((day & DaysOfWeek.Mon) == DaysOfWeek.Mon) // Does a bitwise and then compares it to Mondays enum value
  {
    // Monday was passed in
  }
}

প্রশ্নের উত্তর দেয় না। "আমার বিশেষ পরিস্থিতিতে আমি সিস্টেমটি ব্যবহার করতে চাই ayডাইঅফউইক"
রবার্ট পলসন

তবে এটি 'আমি ঠিক যা খুঁজছিলাম। সুতরাং যাইহোক ধন্যবাদ।
টিলিটো

3
[Flags]
    public enum DaysOfWeek{


        Sunday = 1 << 0,
        Monday = 1 << 1,
        Tuesday = 1 << 2,
        Wednesday = 1 << 3,
        Thursday = 1 << 4,
        Friday =  1 << 5,
        Saturday =  1 << 6
    }

এই বিন্যাসে পদ্ধতি কল

মেথডনম (DaysOfWeek.T মঙ্গলবার | DaysOfWeek.Th বৃহস্পতিবার);

বিকল্পগুলি পাস করার জন্য একটি এনামটোওআরে পদ্ধতি প্রয়োগ করুন

private static void AddEntryToList(DaysOfWeek days, DaysOfWeek match, List<string> dayList, string entryText) {
            if ((days& match) != 0) {
                dayList.Add(entryText);
            }
        }

        internal static string[] EnumToArray(DaysOfWeek days) {
            List<string> verbList = new List<string>();

            AddEntryToList(days, HttpVerbs.Sunday, dayList, "Sunday");
            AddEntryToList(days, HttpVerbs.Monday , dayList, "Monday ");
            ...

            return dayList.ToArray();
        }

প্রশ্নের উত্তর দেয় না। "আমার বিশেষ পরিস্থিতিতে আমি সিস্টেমটি ব্যবহার করতে চাই ayডাই অফউইক"
রবার্ট পলসন

ধন্যবাদ রবার্ট, তবে আপনাকে প্রতিটি উত্তরের প্রতি এটি প্রকাশ করতে হবে না।
রনি ওভারবি

@ রনি - খুব সম্ভবত আমার দোষ যে এতগুলি নিকট-সদৃশ উত্তর রয়েছে যা আসলে প্রশ্নের উত্তর দেয় নি।
রবার্ট পলসন

@ রনি - এনাম টুস্ট্রিং () এবং এনাম.পার্স () সঠিকভাবে একটি [পতাকা] গণনা আউটপুট / পার্স করবে (যতক্ষণ আপনি অবশ্যই গণনার সংস্করণে যত্নবান হন)
রবার্ট পলসন

@ রবার্ট - আমার মনে হয় না যে কেউ আপনাকে দোষ দিচ্ছে। শুধু ভোটগুলি কথা বলতে দিন।
রনি ওভারবি

3

[পতাকা] বৈশিষ্ট্য দিয়ে আপনার এনামকে চিহ্নিত করুন। এছাড়াও নিশ্চিত করুন যে আপনার সমস্ত মানগুলি পারস্পরিকভাবে একচেটিয়া (দুটি মান অন্যটির সাথে সমান হতে পারে না) যেমন আপনার ক্ষেত্রে 1,2,4,8,16,32,64

[Flags]
public enum DayOfWeek
{ 
Sunday = 1,   
Monday = 2,   
Tuesday = 4,   
Wednesday = 8,   
Thursday = 16,   
Friday = 32,    
Saturday = 64
}

আপনার যদি এমন কোনও পদ্ধতি থাকে যা কোনও ডেওফিউইক এনাম গ্রহণ করে বিটওয়াইস বা অপারেটর (|) একসাথে একাধিক সদস্যকে ব্যবহার করতে। উদাহরণ স্বরূপ:

MyMethod(DayOfWeek.Sunday|DayOfWeek.Tuesday|DayOfWeek.Friday)

প্যারামিটারে কোনও নির্দিষ্ট সদস্য রয়েছে কিনা তা পরীক্ষা করতে, আপনি যে সদস্যটির জন্য যাচ্ছেন তার সাথে বিটওয়াইজ এবং অপারেটর (&) ব্যবহার করুন।

if(arg & DayOfWeek.Sunday == DayOfWeek.Sunday)
Console.WriteLine("Contains Sunday");

প্রশ্নের উত্তর দেয় না। "আমার বিশেষ পরিস্থিতিতে আমি সিস্টেমটি ব্যবহার করতে চাই ayডাইঅফউইক"
রবার্ট পলসন

2

রিড কোপসেই সঠিক এবং আমি পারলে মূল পোস্টে যুক্ত করতাম তবে আমি তার বদলে উত্তর দিতে হবে।

কোনও পুরানো এনামে কেবল [পতাকাগুলি] ব্যবহার করা বিপজ্জনক। আমি বিশ্বাস করি যে মানগুলিতে সংঘর্ষ এড়াতে আপনাকে পতাকা ব্যবহার করার সময় এনামের মানগুলি স্পষ্টভাবে দুটি শক্তিতে পরিবর্তন করতে হবে। ফ্ল্যাগস্যাট্রিবিউট এবং এনুমের জন্য নির্দেশিকা দেখুন ।


0

পোস্ট করা উত্তরগুলির সাহায্যে এবং এগুলি:

  1. ফ্ল্যাগএট্রিবিউট ক্লাস ([পতাকা] বৈশিষ্ট্যটি ব্যবহার এবং না ব্যবহারের তুলনা দেখুন)
  2. এনাম ফ্ল্যাগ অ্যাট্রিবিউট

আমার মনে হচ্ছে আমি এটি বেশ ভালভাবে বুঝতে পেরেছি।

ধন্যবাদ।


-3

আপনি যা খুঁজছেন তা এই প্রকৃতির কোনও কিছুর প্রদর্শন করা উচিত:

[Flags]
public enum SomeName
{
    Name1,
    Name2
}

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