এনামের সর্বাধিক মান পাওয়া


147

আপনি কীভাবে এনামের সর্বোচ্চ মূল্য পাবেন?



1
আমি মনে করি যে সংকলক এটি প্রতিস্থাপন কল ব্যবহার করার পরিবর্তে এটি পরিচালনা করতে পারে। এই তথ্যের জন্য একটি সংকলন-সময় পদ্ধতি ব্যবহার করে এমন একটি উত্তর আমার আপ-ভোট গ্রহণ করবে।
পালসুইম

উত্তর:


214

এনাম.গেটভ্যালু () মনে করে মানগুলি যথাযথভাবে ফেরত দেবে বলে মনে হচ্ছে আপনি এর মতো কিছু করতে পারেন:

// given this enum:
public enum Foo
{
    Fizz = 3, 
    Bar = 1,
    Bang = 2
}

// this gets Fizz
var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Last();

সম্পাদন করা

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

var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Max();

... যখন আপনার এনামের কিছু মান negativeণাত্মক হবে তখন এটি কাজ করবে।


3
সুন্দর। এর সদ্ব্যবহার করে: "অ্যারের উপাদানগুলি গণনার ধ্রুবকগুলির বাইনারি মান অনুসারে বাছাই করা হয়" " থেকে msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx
TheSoftwareJedi

2
আমি আমার মাথাটি ছিটকে যাচ্ছিলাম, ভেবেছিলাম এটি সত্যই ট্রিভাল তবে একটি মার্জিত সমাধান দেওয়া হয়েছিল। এছাড়াও আপনি যদি এনাম মানটি পেতে চান তবে কনভার্ট করুন.টোইন্ট 32 () ব্যবহার করুন। এটি গুগলের ফলাফলের জন্য।
jdelator

53
আপনি যদি লিনকিউ ব্যবহার করতে যাচ্ছেন, তবে ম্যাক্স () যা বেশি পরিষ্কার, কেন ব্যবহার করবেন না এবং "মনে হচ্ছে" এর উপর নির্ভর করবেন না?
মার্ক গ্র্যাভেল

3
এটি আরও ভাল পারফর্ম করে, তবে কেবল যদি এনামের মানগুলি নেতিবাচক না হয়, যা তারা হতে পারে।
আইসিআর

4
আমি ম্যাক্সকেও () ভোট দিই। সর্বশেষ () ব্যর্থ হবে যদি এনাম নেতিবাচক না হয় তবে এখানে দেখুন
এজেড।

41

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

সর্বাধিক:

Enum.GetValues(typeof(Foo)).Cast<int>().Max();

নূন্যতম:

Enum.GetValues(typeof(Foo)).Cast<int>().Min();

21

ম্যাট হ্যামিল্টনের উত্তর অনুসারে, আমি এর জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করার কথা ভেবেছিলাম।

যেহেতু ValueTypeজেনেরিক ধরণের প্যারামিটার সীমাবদ্ধতা হিসাবে গ্রহণ করা হয় নি, তাই নীচের চেয়ে সীমাবদ্ধ Tকরার জন্য আমি এর চেয়ে ভাল উপায় খুঁজে পাই না Enum

যে কোনও ধারণা সত্যই প্রশংসা করা হবে।

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

হাওয়েভা, এটি এখানে:

সি #:

static void Main(string[] args)
{
    MyEnum x = GetMaxValue<MyEnum>(); //In newer versions of C# (7.3+)
    MyEnum y = GetMaxValueOld<MyEnum>();  
}

public static TEnum GetMaxValue<TEnum>()
  where TEnum : Enum
{
     return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Max();
}

//When C# version is smaller than 7.3, use this:
public static TEnum GetMaxValueOld<TEnum>()
  where TEnum : IComparable, IConvertible, IFormattable
{
    Type type = typeof(TEnum);

    if (!type.IsSubclassOf(typeof(Enum)))
        throw new
            InvalidCastException
                ("Cannot cast '" + type.FullName + "' to System.Enum.");

    return (TEnum)Enum.ToObject(type, Enum.GetValues(type).Cast<int>().Last());
}



enum MyEnum
{
    ValueOne,
    ValueTwo
}

ভিবি:

Public Function GetMaxValue _
    (Of TEnum As {IComparable, IConvertible, IFormattable})() As TEnum

    Dim type = GetType(TEnum)

    If Not type.IsSubclassOf(GetType([Enum])) Then _
        Throw New InvalidCastException _
            ("Cannot cast '" & type.FullName & "' to System.Enum.")

    Return [Enum].ToObject(type, [Enum].GetValues(type) _
                        .Cast(Of Integer).Last)
End Function

দেখুন stackoverflow.com/questions/79126/... এই জন্য যদি (type.IsEnum!)
কংক্রিট হ্যাংলা

আপনি নিজের স্থানে "স্ট্রাক্ট" যুক্ত করতে পারেন কারণ এটি এটি একটি মান টাইপ নিশ্চিত করবে তবে এটি এনুমের মধ্যে সীমাবদ্ধ রাখবে না এটি আমি ব্যবহার করি: যেখানে টি: স্ট্রাক্ট, আইকাম্পেবল, আইফোর্মেটেবল
jdawiz

2
আপনি আপনার উত্তর আপডেট করতে পারে। সি # 7.3 এ আপনি আসলে এক্সটেনশন পদ্ধতিটি করতে পারেন এবং এনাম টাইপের (স্ট্রাক্টের পরিবর্তে) সীমাবদ্ধও করতে পারেন।
নর্ডেস

যদিও এটি কোনও এক্সটেনশন পদ্ধতি নয়। তবে একটি ভাল ইউটিলিটি পদ্ধতি।
রায়

14

এই সামান্য nitpicky কিন্তু কোন প্রকৃত সর্বোচ্চ মান enumহয় Int32.MaxValue(অভিমানী এটি একটি এর enumথেকে প্রাপ্ত int)। এটি আসলে সেই মানটির সাথে একজন সদস্য ঘোষিত কিনা তা নির্বিশেষে যে কোনও Int32মান দেওয়া কোনওরকম আইনী enum

আইনগত:

enum SomeEnum
{
    Fizz = 42
}

public static void SomeFunc()
{
    SomeEnum e = (SomeEnum)5;
}

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

9

আরও একবার চেষ্টা করার পরে, আমি এই এক্সটেনশন পদ্ধতিটি পেয়েছি:

public static class EnumExtension
{
    public static int Max(this Enum enumType)
    {           
        return Enum.GetValues(enumType.GetType()).Cast<int>().Max();             
    }
}

class Program
{
    enum enum1 { one, two, second, third };
    enum enum2 { s1 = 10, s2 = 8, s3, s4 };
    enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };

    static void Main(string[] args)
    {
        Console.WriteLine(enum1.one.Max());        
    }
}

5

সর্বশেষ ফাংশনটি ব্যবহার করে সর্বাধিক মান পাওয়া যায়নি। "সর্বোচ্চ" ফাংশন পারে ব্যবহার করুন। ভালো লেগেছে:

 class Program
    {
        enum enum1 { one, two, second, third };
        enum enum2 { s1 = 10, s2 = 8, s3, s4 };
        enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };

        static void Main(string[] args)
        {
            TestMaxEnumValue(typeof(enum1));
            TestMaxEnumValue(typeof(enum2));
            TestMaxEnumValue(typeof(enum3));
        }

        static void TestMaxEnumValue(Type enumType)
        {
            Enum.GetValues(enumType).Cast<Int32>().ToList().ForEach(item =>
                Console.WriteLine(item.ToString()));

            int maxValue = Enum.GetValues(enumType).Cast<int>().Max();     
            Console.WriteLine("The max value of {0} is {1}", enumType.Name, maxValue);
        }
    }

4

সি # এর জন্য ম্যাথু জে সুলিভানের সাথে চুক্তিতে:

   Enum.GetValues(typeof(MyEnum)).GetUpperBound(0);

আমি কেন সত্যিই নিশ্চিত নই যে কেউ কেন ব্যবহার করতে চাইবে:

   Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Last();

... শব্দ-শব্দ হিসাবে, শব্দার্থভাবে বলতে গেলে, এটি এতটা বোধগম্য বলে মনে হচ্ছে না? (সর্বদা বিভিন্ন উপায়ে রাখা ভাল, তবে আমি পরে কোনও উপকার দেখি না))


4
গেটআপারবাউন্ড ব্যবহার করে আমার জন্য একটি গণনা (4, 40 নয়) প্রদান করে: মাইইনুম {a = 0, বি = 10, সি = 20, ডি = 30, ই = 40}
অ্যালিরোব

ভাল ধরা, আমি এটা খেয়াল করিনি। ঠিক আছে, সুতরাং এই সংস্করণটি মানক অটো-এনামগুলির জন্য দুর্দান্ত তবে কাস্টম মানগুলির সাথে এনামগুলির পক্ষে নয়। আমার ধারণা বিজয়ী রয়েছেন মিঃ হ্যামিলটন। :)
প্রকৌশলী

যখন আপনার এনামের বিটওয়াইজ মান হয় তখন গেটআপারবাউন্ডটি ভাল। (যেমন - 1, 2, 4, 8, ইত্যাদি)। উদাহরণস্বরূপ, আপনি একটি ইউনিট পরীক্ষা লিখতে থাকলে, আপনি একটি লুপ ডাব্লু / এই বহু পুনরাবৃত্তির মাধ্যমে কাজ করতে চান: ম্যাথ.পো (2, এনাম.গেটভ্যালিজ (টাইপফ (মাইইনাম))। গেটআপারবাউন্ড (0))।
WEFX

দৈর্ঘ্যের (এনামের মান সংখ্যার জন্য) কী ভুল? সহজ আরও ভাল। (এটি আসল প্রশ্নের উত্তর দেয় না))
আয়ান গোল্ডবি

2

System.Enum এর অধীনে গণনা করা প্রকারগুলি সম্পর্কে তথ্য পাওয়ার জন্য বিভিন্ন পদ্ধতি রয়েছে।

সুতরাং, ভিজ্যুয়াল স্টুডিওতে একটি ভিবি. নেট প্রকল্পে আমি "সিস্টেম.ইনুম" টাইপ করতে পারি। এবং বুদ্ধি সব ধরণের কল্যাণ নিয়ে আসে।

বিশেষত একটি পদ্ধতি হ'ল System.Enum.GetValues ​​(), যা গণিত মানের একটি অ্যারে প্রদান করে। একবার অ্যারেটি পেয়ে গেলে আপনার বিশেষ পরিস্থিতিতে উপযুক্ত যা করা উচিত তা করা উচিত।

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

ভিবি.নেট কোড স্নিপেটস:

'''''''

Enum MattType
  zerothValue         = 0
  firstValue          = 1
  secondValue         = 2
  thirdValue          = 3
End Enum

'''''''

Dim iMax      As Integer

iMax = System.Enum.GetValues(GetType(MattType)).GetUpperBound(0)

MessageBox.Show(iMax.ToString, "Max MattType Enum Value")

'''''''

অ্যারে ফাঁক থাকলে কাজ করে না। এটি কেবল দুর্ঘটনাক্রমেও কাজ করে, কারণ উপাদান সূচকটি সেই সূচীতে সঞ্চিত মানের সমান হয়। অ্যারের মধ্যে ফিরে পাওয়া অ্যারের GetUpperBound()সর্বোচ্চ সম্ভাব্য সূচকটি পুনরুদ্ধার করে GetValues(), সেই অ্যারের ভিতরে সঞ্চিত সর্বোচ্চ মান নয়।
JensG

2

এফ # তে এনামকে একটি অনুক্রমে রূপান্তর করতে একটি সহায়ক ফাংশন সহ:

type Foo =
    | Fizz  = 3
    | Bang  = 2

// Helper function to convert enum to a sequence. This is also useful for iterating.
// stackoverflow.com/questions/972307/can-you-loop-through-all-enum-values-c
let ToSeq (a : 'A when 'A : enum<'B>) =
    Enum.GetValues(typeof<'A>).Cast<'B>()

// Get the max of Foo
let FooMax = ToSeq (Foo()) |> Seq.max   

এটি চলমান ...

> Foo = টাইপ করুন ফিজ = 3 | ব্যাং = 2
> ভাল তোসেক: 'এ -> সিক << বি> যখন' এ: এনুম <'বি>
> ভাল FooMax: ফু = ফিজ

when 'A : enum<'B>সংজ্ঞা জন্য কম্পাইলার দ্বারা প্রয়োজন হয় না, কিন্তু ToSeq কোন ব্যবহারের জন্য প্রয়োজন বোধ করা হয়, এমনকি একটি বৈধ enum টাইপ দ্বারা।


1

এটি সব পরিস্থিতিতে ব্যবহারযোগ্য নয়, তবে আমি প্রায়শই নিজেরাই সর্বোচ্চ মানটি সংজ্ঞায়িত করি:

enum Values {
  one,
  two,
  tree,
  End,
}

for (Values i = 0; i < Values.End; i++) {
  Console.WriteLine(i);
}

var random = new Random();
Console.WriteLine(random.Next((int)Values.End));

অবশ্যই আপনি এনামে কাস্টম মানগুলি ব্যবহার করার সময় এটি কাজ করবে না, তবে প্রায়শই এটি একটি সহজ সমাধান হতে পারে।


1

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

public enum ChannelMessageTypes : byte
{
    Min                 = 0x80, // Or could be: Min = NoteOff
    NoteOff             = 0x80,
    NoteOn              = 0x90,
    PolyKeyPressure     = 0xA0,
    ControlChange       = 0xB0,
    ProgramChange       = 0xC0,
    ChannelAfterTouch   = 0xD0,
    PitchBend           = 0xE0,
    Max                 = 0xE0  // Or could be: Max = PitchBend
}

// I use it like this to check if a ... is a channel message.
if(... >= ChannelMessageTypes.Min || ... <= ChannelMessages.Max)
{
    Console.WriteLine("Channel message received!");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.