Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีคำนวณจำนวนสมาชิกใน Enum ใน C#

การนับจำนวนค่าใน 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)).Lengthintนับจำนวนชื่อ (แนะนำ)
Enum.GetValues(typeof(T)).Lengthintนับจำนวนค่า (เหมือน 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>()) { ... }