উত্তর:
এনাম.গেটভ্যালু () মনে করে মানগুলি যথাযথভাবে ফেরত দেবে বলে মনে হচ্ছে আপনি এর মতো কিছু করতে পারেন:
// 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ণাত্মক হবে তখন এটি কাজ করবে।
আমি ম্যাট এর উত্তর সাথে একমত। আপনার যদি সর্বাধিক ন্যূনতম এবং সর্বাধিক int মানগুলির প্রয়োজন হয় তবে আপনি এটি নিম্নলিখিত হিসাবে এটি করতে পারেন।
সর্বাধিক:
Enum.GetValues(typeof(Foo)).Cast<int>().Max();
নূন্যতম:
Enum.GetValues(typeof(Foo)).Cast<int>().Min();
ম্যাট হ্যামিল্টনের উত্তর অনুসারে, আমি এর জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করার কথা ভেবেছিলাম।
যেহেতু 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
এই সামান্য nitpicky কিন্তু কোন প্রকৃত সর্বোচ্চ মান enum
হয় Int32.MaxValue
(অভিমানী এটি একটি এর enum
থেকে প্রাপ্ত int
)। এটি আসলে সেই মানটির সাথে একজন সদস্য ঘোষিত কিনা তা নির্বিশেষে যে কোনও Int32
মান দেওয়া কোনওরকম আইনী enum
।
আইনগত:
enum SomeEnum
{
Fizz = 42
}
public static void SomeFunc()
{
SomeEnum e = (SomeEnum)5;
}
আরও একবার চেষ্টা করার পরে, আমি এই এক্সটেনশন পদ্ধতিটি পেয়েছি:
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());
}
}
সর্বশেষ ফাংশনটি ব্যবহার করে সর্বাধিক মান পাওয়া যায়নি। "সর্বোচ্চ" ফাংশন পারে ব্যবহার করুন। ভালো লেগেছে:
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);
}
}
সি # এর জন্য ম্যাথু জে সুলিভানের সাথে চুক্তিতে:
Enum.GetValues(typeof(MyEnum)).GetUpperBound(0);
আমি কেন সত্যিই নিশ্চিত নই যে কেউ কেন ব্যবহার করতে চাইবে:
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Last();
... শব্দ-শব্দ হিসাবে, শব্দার্থভাবে বলতে গেলে, এটি এতটা বোধগম্য বলে মনে হচ্ছে না? (সর্বদা বিভিন্ন উপায়ে রাখা ভাল, তবে আমি পরে কোনও উপকার দেখি না))
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()
, সেই অ্যারের ভিতরে সঞ্চিত সর্বোচ্চ মান নয়।
এফ # তে এনামকে একটি অনুক্রমে রূপান্তর করতে একটি সহায়ক ফাংশন সহ:
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 টাইপ দ্বারা।
এটি সব পরিস্থিতিতে ব্যবহারযোগ্য নয়, তবে আমি প্রায়শই নিজেরাই সর্বোচ্চ মানটি সংজ্ঞায়িত করি:
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));
অবশ্যই আপনি এনামে কাস্টম মানগুলি ব্যবহার করার সময় এটি কাজ করবে না, তবে প্রায়শই এটি একটি সহজ সমাধান হতে পারে।
আমার এনামের ন্যূনতম এবং সর্বাধিক মানগুলির প্রয়োজন হলে আমি নিম্নলিখিতটি ব্যবহার করেছি। আমি কেবল গণনাটির সর্বনিম্ন মানের সমান এক মিনিট এবং এনুম মান হিসাবে তাদের মান হিসাবে সর্বোচ্চ মানের সমান সর্বোচ্চ সেট করেছি।
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!");
}