ค้นหาสตริงใน Enum และส่งคืน Enum


163

ฉันมีการแจงนับ:

public enum MyColours
{
    Red,
    Green,
    Blue,
    Yellow,
    Fuchsia,
    Aqua,
    Orange
}

และฉันมีสตริง:

string colour = "Red";

ฉันต้องการที่จะกลับมา:

MyColours.Red

จาก:

public MyColours GetColour(string colour)

จนถึงตอนนี้ฉันมี:

public MyColours GetColours(string colour)
{
    string[] colours = Enum.GetNames(typeof(MyColours));
    int[]    values  = Enum.GetValues(typeof(MyColours));
    int i;
    for(int i = 0; i < colours.Length; i++)
    {
        if(colour.Equals(colours[i], StringComparison.Ordinal)
            break;
    }
    int value = values[i];
    // I know all the information about the matched enumeration
    // but how do i convert this information into returning a
    // MyColour enumeration?
}

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

MyColour(2) 

จะส่งผลให้

MyColour.Green


4
@nawfal ไม่พบว่าเมื่อฉันถามเรื่องนี้เมื่อหลายปีก่อน มีการโหวตให้ปิดเหมือนซ้ำ
Matt Clarkson

คำตอบ:


381

ตรวจสอบ System.Enum.Parse:


enum Colors {Red, Green, Blue}

// your code:
Colors color = (Colors)System.Enum.Parse(typeof(Colors), "Green");


72
อย่าลืมว่าคุณสามารถละเว้นความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่โดยป้อนพารามิเตอร์ตัวที่สามเป็น "จริง"
Aerophilic

สิ่งที่ฉันกำลังมองหา! ไชโย!
Zame

11
@ user1531040 ที่จริงแล้วมี Enum.TryParse
DarLom

โปรดทราบว่าการแจงนับ enum จะ 'สำเร็จ' เสมอหากอินพุตเป็นตัวเลข มันแค่คืนค่าจำนวนการแจงซึ่งจะนำไปใช้กับประเภทของ enum ดังนั้นหากคุณต้องการตรวจสอบว่าการป้อนข้อมูลของผู้ใช้บางคนเป็น enum ที่ถูกต้องหรืออย่างอื่นคุณควรตรวจสอบเนื้อหาที่เป็นตัวเลขก่อน เนื่องจากมันส่งคืน enum ที่ถูกต้อง แต่ด้วยค่าที่อาจไม่มีอยู่ในชื่อ enum ที่กำหนดคุณสามารถได้รับปัญหาแปลก ๆ บางอย่าง
Nyerguds

19

คุณสามารถส่ง int ไปยัง enum ได้

(MyColour)2

นอกจากนี้ยังมีตัวเลือกของ Enum.Parse

(MyColour)Enum.Parse(typeof(MyColour), "Red")

11

รับการเปลี่ยนแปลงล่าสุดและยิ่งใหญ่ที่สุดใน. NET (+ Core) และ C # 7 นี่คือทางออกที่ดีที่สุด:

var ignoreCase = true;
Enum.TryParse("red", ignoreCase , out MyColours colour);

ตัวแปรสีสามารถใช้ภายในขอบเขตของ Enum.TryParse



2

ฉันทำเครื่องหมายคำตอบของ OregonGhost +1 จากนั้นฉันพยายามใช้การวนซ้ำและรู้ว่ามันไม่ถูกต้องเพราะ Enum.GetNames ส่งคืนสตริง คุณต้องการ Enum.GetValues:

public MyColours GetColours(string colour)
{  
   foreach (MyColours mc in Enum.GetValues(typeof(MyColours))) 
   if (mc.ToString() == surveySystem) 
      return mc;

   return MyColors.Default;
}

1

คุณสามารถใช้Enum.Parseเพื่อรับค่า enum จากชื่อ คุณสามารถวนซ้ำค่าทั้งหมดด้วยEnum.GetNamesและคุณสามารถแปลง int เป็น enum เพื่อรับค่า enum จากค่า int

เช่นนี้ตัวอย่างเช่น:

public MyColours GetColours(string colour)
{
    foreach (MyColours mc in Enum.GetNames(typeof(MyColours))) {
        if (mc.ToString().Contains(colour)) {
            return mc;
        }
    }
    return MyColours.Red; // Default value
}

หรือ:

public MyColours GetColours(string colour)
{
    return (MyColours)Enum.Parse(typeof(MyColours), colour, true); // true = ignoreCase
}

หลังจะโยน ArgumentException หากไม่พบค่าคุณอาจต้องการจับภายในฟังก์ชันและส่งคืนค่าเริ่มต้น


หมายเหตุ: มันควรจะเป็น Enum.GetValues ​​แน่นอนตามที่แสดงในคำตอบของโคลิน
OregonGhost

1
var color =  Enum.Parse<Colors>("Green");

สิ่งนี้ไม่ได้รวบรวม ไม่มีParseวิธีการทั่วไป
João Menighin

มันรวบรวมและทำงานให้ฉัน อาจขึ้นอยู่กับรุ่นที่คุณใช้งานอยู่ ฉันใช้. NET core 3.1
Vinni

0

ดังที่กล่าวไว้ในคำตอบก่อนหน้านี้คุณสามารถส่งไปยังประเภทข้อมูลพื้นฐาน (int -> ประเภท enum) หรือแยกวิเคราะห์ (สตริง -> ประเภท enum)

แต่ระวัง - ไม่มี. TryParse สำหรับ enums ดังนั้นคุณจะต้องลอง / จับบล็อกรอบการแยกวิเคราะห์เพื่อตรวจจับความล้มเหลว


3
ไม่ก่อนถามคำถามนี้ แต่ตอนนี้มี ณ . NET 4! msdn.microsoft.com/en-us/library/system.enum.tryparse.aspx มันจะเป็นอะไรที่เหมือน Enum.TryParse <MyColour> ("สีแดง", สีออก)
WienerDog

0
class EnumStringToInt // to search for a string in enum
{
    enum Numbers{one,two,hree};
    static void Main()
    {
        Numbers num = Numbers.one; // converting enum to string
        string str = num.ToString();
        //Console.WriteLine(str);
        string str1 = "four";
        string[] getnames = (string[])Enum.GetNames(typeof(Numbers));
        int[] getnum = (int[])Enum.GetValues(typeof(Numbers));
        try
        {
            for (int i = 0; i <= getnum.Length; i++)
            {
                if (str1.Equals(getnames[i]))
                {
                    Numbers num1 = (Numbers)Enum.Parse(typeof(Numbers), str1);
                    Console.WriteLine("string found:{0}", num1);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Value not found!", ex);
        }
    }
}

2
C # มีฟังก์ชันการทำงานในตัวสำหรับสิ่งนี้
Artemix

นี่เป็นคำตอบของคำถามอย่างไร ดูคำตอบอื่น ๆ สำหรับรหัสที่ง่ายขึ้นมาก
Firo

0

สิ่งหนึ่งที่อาจเป็นประโยชน์กับคุณ (นอกเหนือจากคำตอบที่ถูกต้อง / ดีให้แล้ว) คือความคิด StringEnum ให้ไว้ที่นี่

ด้วยวิธีนี้คุณสามารถกำหนด enumerations ของคุณเป็นคลาส (ตัวอย่างอยู่ใน vb.net):

<StringEnumRegisteredOnly (), DebuggerStepThrough (), ImmutableObject (True)> คลาสสาธารณะที่ไม่สามารถสืบทอดได้ eAuthenticationMethod Inherits StringEnumBase (ของ eAuthenticationMethod)

Private Sub New(ByVal StrValue As String)
  MyBase.New(StrValue)   
End Sub

< Description("Use User Password Authentication")> Public Shared ReadOnly UsernamePassword As New eAuthenticationMethod("UP")   

< Description("Use Windows Authentication")> Public Shared ReadOnly WindowsAuthentication As New eAuthenticationMethod("W")   

จบชั้น

และตอนนี้คุณสามารถใช้คลาสนี้ตามที่คุณต้องการใช้ enum: eAuthenticationMethod.WindowsAuthentication และสิ่งนี้จะเหมือนกับการกำหนด ' W ' ค่าตรรกะของWindowsAuthentication (ภายใน enum) และถ้าคุณดูค่านี้จากคุณสมบัติ หน้าต่าง (หรืออย่างอื่นที่ใช้คุณสมบัติ System.ComponentModel.Description) คุณจะได้รับ " ใช้การพิสูจน์ตัวจริงของ Windows "

ฉันใช้มันมานานแล้วและมันทำให้รหัสชัดเจนขึ้นโดยเจตนา



-1

คุณอาจต้องการตรวจสอบคำแนะนำในโพสต์บล็อกนี้: Enum <T> เพื่อนใหม่ของฉัน

โพสต์อธิบายถึงวิธีการสร้างคลาสตัวช่วยทั่วไปที่ง่ายมากซึ่งช่วยให้คุณหลีกเลี่ยงไวยากรณ์การคัดเลือกนักแสดงที่น่าเกลียดที่มีอยู่Enum.Parse- แต่คุณจะต้องเขียนสิ่งนี้ในรหัสของคุณแทน:

MyColours colour = Enum<MyColours>.Parse(stringValue); 

หรือตรวจสอบความคิดเห็นบางส่วนในโพสต์เดียวกันซึ่งพูดคุยเกี่ยวกับการใช้วิธีการขยายเพื่อให้บรรลุคล้ายกัน


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