ฉันจะรับจำนวนรายการที่กำหนดใน enum ได้อย่างไร
ฉันจะรับจำนวนรายการที่กำหนดใน enum ได้อย่างไร
คำตอบ:
คุณสามารถใช้วิธีการคงEnum.GetNames
ที่ซึ่งส่งกลับอาร์เรย์ที่แสดงชื่อของรายการทั้งหมดใน enum คุณสมบัติความยาวของอาร์เรย์นี้เท่ากับจำนวนรายการที่กำหนดใน enum
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
คำถามคือ:
ฉันจะรับจำนวนรายการที่กำหนดใน enum ได้อย่างไร
จำนวนรายการ "อาจหมายถึงสองสิ่งที่แตกต่างอย่างสิ้นเชิง ลองพิจารณาตัวอย่างต่อไปนี้
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
จำนวนของ "รายการ" ที่กำหนดไว้MyEnum
คืออะไร?
จำนวนรายการ 5 หรือไม่ ( A
, B
, C
, D
, E
)
หรือมันคือ 3 ( 1
, 2
, 3
)
จำนวนชื่อที่กำหนดในMyEnum
(5) สามารถคำนวณได้ดังนี้
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
จำนวนค่าที่กำหนดในMyEnum
(3) สามารถคำนวณได้ดังนี้
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();
.
Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...
;)
Enum.GetValues (typeof (MyEnum)) ความยาว;
เคล็ดลับที่ดีที่ฉันเห็นในคำตอบ C สำหรับคำถามนี้เพียงเพิ่มองค์ประกอบสุดท้ายให้กับ enum และใช้มันเพื่อบอกว่ามีองค์ประกอบอยู่ใน enum กี่องค์ประกอบ:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
ในกรณีที่คุณกำหนดค่าเริ่มต้นนอกเหนือจาก 0 คุณสามารถใช้ NumberOfTypes - Type1 เพื่อตรวจสอบจำนวนองค์ประกอบ
ฉันไม่แน่ใจว่าวิธีนี้จะเร็วกว่าการใช้ Enum หรือไม่และฉันก็ไม่แน่ใจว่าจะเป็นวิธีที่เหมาะสมในการทำเช่นนี้หรือไม่เนื่องจากเรามี Enum เพื่อยืนยันข้อมูลนี้ให้เรา
จากคำตอบก่อนหน้าเพียงแค่เพิ่มตัวอย่างโค้ด
class Program
{
static void Main(string[] args)
{
int enumlen = Enum.GetNames(typeof(myenum)).Length;
Console.Write(enumlen);
Console.Read();
}
public enum myenum
{
value1,
value2
}
}
คุณสามารถใช้ Enum.GetNames เพื่อส่งคืนค่า IEnumerable ใน enum ของคุณจากนั้นนับจำนวน IEnumer ที่เป็นผลลัพธ์
GetNames ให้ผลลัพธ์เหมือนกับ GetValues แต่เร็วกว่ามาก
หากคุณพบว่าตัวเองเขียนโซลูชันข้างต้นได้บ่อยเท่าที่ฉันทำคุณสามารถนำไปใช้เป็นแบบทั่วไป:
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;
}
ตอนนี้ฉันกำลังดูเรื่องนี้อยู่และไม่พอใจกับความสามารถในการอ่านของโซลูชันปัจจุบัน หากคุณกำลังเขียนรหัสอย่างไม่เป็นทางการหรือในโครงการขนาดเล็กคุณสามารถเพิ่มรายการอื่น ๆ ในส่วนท้ายของ enum ของคุณที่เรียกว่า "ความยาว" ด้วยวิธีนี้คุณจะต้องพิมพ์:
var namesCount = (int)MyEnum.Length;
แน่นอนถ้าคนอื่นจะใช้รหัสของคุณ - หรือฉันแน่ใจว่าภายใต้สถานการณ์อื่น ๆ ที่ไม่ได้ใช้กับฉันในกรณีนี้ - การแก้ปัญหานี้อาจจะได้ทุกที่จากคำแนะนำที่ไม่ดีไปจนถึงแย่มาก
สำหรับ Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
ไม่ได้ทำงานกับฉัน แต่
[Enum].GetNames(GetType(Animal_Type)).length
ทำ