การนับจำนวนค่าใน Enum
Enum (Enumeration) คือชนิดข้อมูลที่กำหนดค่าคงที่กลุ่มหนึ่ง โดยค่าแรก = 0 เพิ่มทีละ 1 (หากไม่ระบุค่าเอง)
วิธีหลัก: ใช้ Enum.GetNames()
using System;
class Program
{
enum Level
{
Low,
Medium,
High
}
public static void Main()
{
// วิธีที่ 1: GetNames().Length (แนะนำ - อ่านง่าย)
int count = Enum.GetNames(typeof(Level)).Length;
Console.WriteLine($"จำนวนสมาชิก: {count}"); // 3
// วิธีที่ 2: GetValues().Length (เหมือนกันแต่คืน array ของค่า)
int count2 = Enum.GetValues(typeof(Level)).Length;
Console.WriteLine($"จำนวนสมาชิก (GetValues): {count2}"); // 3
// แสดงชื่อและค่าทั้งหมด
Console.WriteLine("\nรายการสมาชิก:");
foreach (string name in Enum.GetNames(typeof(Level)))
{
Level value = (Level)Enum.Parse(typeof(Level), name);
Console.WriteLine($"{name} = {(int)value}");
}
}
}
ผลลัพธ์:
จำนวนสมาชิก: 3 จำนวนสมาชิก (GetValues): 3 รายการสมาชิก: Low = 0 Medium = 1 High = 2
Enum ที่กำหนดค่าเอง (Custom Values)
using System;
class Program
{
enum HttpStatus
{
OK = 200,
NotFound = 404,
InternalError = 500,
BadRequest = 400
}
public static void Main()
{
int count = Enum.GetNames(typeof(HttpStatus)).Length;
Console.WriteLine($"จำนวน: {count}"); // 4
// ค่าไม่เรียงลำดับก็ได้
foreach (var name in Enum.GetNames(typeof(HttpStatus)))
{
var value = (HttpStatus)Enum.Parse(typeof(HttpStatus), name);
Console.WriteLine($"{name} = {(int)value}");
}
}
}
ผลลัพธ์:
จำนวน: 4 OK = 200 NotFound = 404 InternalError = 500 BadRequest = 400
Flags Enum (Bitwise)
using System;
[Flags]
enum FileAccess
{
None = 0,
Read = 1,
Write = 2,
Execute = 4,
ReadWrite = Read | Write, // 3
All = Read | Write | Execute // 7
}
class Program
{
public static void Main()
{
int count = Enum.GetNames(typeof(FileAccess)).Length;
Console.WriteLine($"จำนวน (รวม combination): {count}"); // 6
// ตรวจสอบ flag
FileAccess access = FileAccess.Read | FileAccess.Write;
Console.WriteLine($"Has Read: {access.HasFlag(FileAccess.Read)}"); // True
Console.WriteLine($"Has Execute: {access.HasFlag(FileAccess.Execute)}"); // False
}
}
สรุปเมธอดที่ใช้ได้
| เมธอด | คืนค่า | เหมาะสำหรับ |
|---|---|---|
Enum.GetNames(typeof(T)).Length | int | นับจำนวนชื่อ (แนะนำ) |
Enum.GetValues(typeof(T)).Length | int | นับจำนวนค่า (เหมือน GetNames) |
Enum.GetNames(typeof(T)) | string[] | วนลูปชื่อ |
Enum.GetValues(typeof(T)) | Array | วนลูปค่า (ต้อง cast) |
ประสิทธิภาพ
GetNamesและGetValuesสร้าง array ใหม่ทุกครั้งที่เรียก- หากเรียกบ่อย ควร cache ไว้:
private static readonly string[] _names = Enum.GetNames(typeof(MyEnum)); - ใน .NET 6+ มี
Enum.GetNames<T>()generic version ที่สะดวกกว่า
.NET 6+ Generic Syntax
// .NET 6+
int count = Enum.GetNames<Level>().Length;
foreach (var name in Enum.GetNames<Level>()) { ... }
foreach (var value in Enum.GetValues<Level>()) { ... }