จำนวนรายการทั้งหมดที่กำหนดใน enum


คำตอบ:


430

คุณสามารถใช้วิธีการคงEnum.GetNamesที่ซึ่งส่งกลับอาร์เรย์ที่แสดงชื่อของรายการทั้งหมดใน enum คุณสมบัติความยาวของอาร์เรย์นี้เท่ากับจำนวนรายการที่กำหนดใน enum

var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;

1
ตกลง ... นี่คือลิงค์ที่ฉันพบcsharp411.com/c-count-items-in-an-enum
ผู้ใช้ SO

8
อาจใช้ Enum.GetValues
Xonatron

6
System.Enum.GetNames หากคุณยังไม่ได้รวม System namespace
Brett Pennings

4
ดังนั้นฉันเพิ่งพบปัญหานี้อีกครั้งในวันนี้; เคล็ดลับสไตล์ C ตามที่อธิบายไว้ในคำตอบอื่น ๆ ด้านล่างแสดงว่าเป็นปัญหา แต่ทั้ง Enum.GetValues ​​และ Enum.GetNames ตามที่กล่าวข้างต้นดูเหมือนว่าพวกเขามีความเสี่ยงในการจัดสรรอาร์เรย์ใหม่ทั้งหมดเพื่อให้ได้ความยาวคงที่ซึ่งดูเหมือนว่า ... น่ากลัว ไม่มีใครทราบว่าวิธีการนี้จะมีการจัดสรรแบบไดนามิกหรือไม่ ถ้าเป็นเช่นนั้นสำหรับกรณีการใช้งานบางอย่างดูเหมือนว่าทางออกที่มีประสิทธิภาพมากที่สุดหากไม่ใช่ความยืดหยุ่นมากที่สุด
J Trana

174

คำถามคือ:

ฉันจะรับจำนวนรายการที่กำหนดใน 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();

2
ทางเลือกอื่นของการเขียนบรรทัดสุดท้าย, var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();.
Jeppe Stig Nielsen

3
ฉันไม่สามารถนึกถึงนักพัฒนาซอฟต์แวร์ใด ๆ ที่ฉันเคยพบเจอในชีวิตซึ่งยืนยันว่า Enum ดังกล่าวมี 3 รายการ
motoDrizzt

2
@motoDrizzt คุณสามารถค้นหาบางสิ่งเช่นนั้นได้ที่ enum ของไดรเวอร์เครื่องพิมพ์เช่นDefault = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...;)
shA.t


14

เคล็ดลับที่ดีที่ฉันเห็นในคำตอบ C สำหรับคำถามนี้เพียงเพิ่มองค์ประกอบสุดท้ายให้กับ enum และใช้มันเพื่อบอกว่ามีองค์ประกอบอยู่ใน enum กี่องค์ประกอบ:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

ในกรณีที่คุณกำหนดค่าเริ่มต้นนอกเหนือจาก 0 คุณสามารถใช้ NumberOfTypes - Type1 เพื่อตรวจสอบจำนวนองค์ประกอบ

ฉันไม่แน่ใจว่าวิธีนี้จะเร็วกว่าการใช้ Enum หรือไม่และฉันก็ไม่แน่ใจว่าจะเป็นวิธีที่เหมาะสมในการทำเช่นนี้หรือไม่เนื่องจากเรามี Enum เพื่อยืนยันข้อมูลนี้ให้เรา


1
นี้เป็นสิ่งที่ดีเนื่องจากฉันสามารถทำเช่นนี้ใน XNA เพราะ GetNames ไม่สามารถใช้งานได้ที่นั่น
Thiago Valle

เคล็ดลับสุดยอดนี่จะเร็วกว่า GetNames () เพราะไม่จำเป็นต้องนับ
Jordan LaPrise

4
ระวังโค้ดที่วนรอบ enums ผ่าน foreach - คุณสามารถอ่านส่วนท้ายของอาร์เรย์ได้!
Michael Dorgan

4
นอกจากนี้ระวัง enums ที่กำหนดค่าของตัวเอง - ฉันมักจะใช้ enums สำหรับค่าสถานะบิต
Matt Parkins

1
นอกจากนี้ระวังการเชื่อม enum โดยตรงกับคอนโทรล wpf บางตัวเช่นคอมโบ
บ็อกซ์

6

จากคำตอบก่อนหน้าเพียงแค่เพิ่มตัวอย่างโค้ด

 class Program
    {
        static void Main(string[] args)
        {
            int enumlen = Enum.GetNames(typeof(myenum)).Length;
            Console.Write(enumlen);
            Console.Read();
        }
        public enum myenum
        {
            value1,
            value2
        }
    }

5

คุณสามารถใช้ Enum.GetNames เพื่อส่งคืนค่า IEnumerable ใน enum ของคุณจากนั้นนับจำนวน IEnumer ที่เป็นผลลัพธ์

GetNames ให้ผลลัพธ์เหมือนกับ GetValues ​​แต่เร็วกว่ามาก


5

หากคุณพบว่าตัวเองเขียนโซลูชันข้างต้นได้บ่อยเท่าที่ฉันทำคุณสามารถนำไปใช้เป็นแบบทั่วไป:

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;
}

1

ตอนนี้ฉันกำลังดูเรื่องนี้อยู่และไม่พอใจกับความสามารถในการอ่านของโซลูชันปัจจุบัน หากคุณกำลังเขียนรหัสอย่างไม่เป็นทางการหรือในโครงการขนาดเล็กคุณสามารถเพิ่มรายการอื่น ๆ ในส่วนท้ายของ enum ของคุณที่เรียกว่า "ความยาว" ด้วยวิธีนี้คุณจะต้องพิมพ์:

var namesCount = (int)MyEnum.Length;

แน่นอนถ้าคนอื่นจะใช้รหัสของคุณ - หรือฉันแน่ใจว่าภายใต้สถานการณ์อื่น ๆ ที่ไม่ได้ใช้กับฉันในกรณีนี้ - การแก้ปัญหานี้อาจจะได้ทุกที่จากคำแนะนำที่ไม่ดีไปจนถึงแย่มาก


2
สิ่งนี้ยังขึ้นอยู่กับ enum เริ่มต้นที่ 0 (ค่าเริ่มต้น แต่ไม่รับประกันว่าจะมี) นอกจากนี้ยังทำให้ระบบ Intellisense สำหรับการใช้ Enum ปกติสับสนมาก นี่เป็นความคิดที่แย่เกือบทุกครั้ง
BradleyDotNET

2
นั่นใช้เวลาไม่นาน :)
EnergyWasRaw

1
น่าสนใจฉันคิดว่าคุณไม่มีทางรู้ว่าเมื่อไรจะมีอะไรดีกว่านี้อีก ฉันพยายามอย่างเต็มที่เพื่อหลบเลี่ยงทางออกของตัวเอง แต่พบว่ามันน่าสนใจพอที่จะแบ่งปัน!
EnergyWasRaw

1

สำหรับ Visual Basic:

[Enum].GetNames(typeof(MyEnum)).Lengthไม่ได้ทำงานกับฉัน แต่ [Enum].GetNames(GetType(Animal_Type)).lengthทำ


ทำไมต้องลงคะแนน? นี่เป็นการแก้ไขปัญหาของฉันมันเป็นไวยากรณ์ที่ถูกต้องสำหรับ VB แม้ว่าคำถามจะถูกแท็ก c # แต่ก็ยังมีประโยชน์
M Granja

2
Downvotes อาจเป็นเพราะคำถามถูกแท็ก C # และคำตอบนี้ไม่ได้กล่าวถึงว่าไม่ได้ใช้ C #
idbrii
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.