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
세 번째 선택적 매개 변수를 "true"로 전달하여 대소 문자 구분을 무시하도록 할 수 있음을 잊지 마십시오
— Aerophilic

정확히 내가 찾던 것! 건배!
— Zame

11
@ user1531040 실제로 Enum.TryParse가 있습니다.
— DarLom

입력이 숫자이면 열거 구문 분석이 항상 '성공'합니다. 구문 분석 된 숫자를 반환 한 다음 열거 형 유형으로 캐스팅됩니다. 따라서 일부 사용자 입력이 유효한 열거 형인지 아니면 다른 항목인지 확인하려면 먼저 숫자 내용을 확인해야합니다. 유효한 열거 형을 반환하지만 정의 된 열거 형 이름에는 전혀 존재하지 않는 값을 반환하기 때문에 실제로 이상한 문제가 발생할 수 있습니다.
— Nyerguds

19

int를 열거 형으로 캐스팅 할 수 있습니다

(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의 범위 내에서 사용할 수 있습니다.



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.GetNames할 수 있으며 int를 열거 형으로 캐스팅하여 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을 발생 시키며, 함수 내에서이를 잡아서 기본값을 리턴 할 수 있습니다.


참고 : 물론 Colin의 답변에 표시된 것처럼 Enum.GetValues ​​여야합니다.
— OregonGhost

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

컴파일조차되지 않습니다. 일반적인 Parse방법 은 없습니다 .
— João Menighin

그것은 컴파일하고 나를 위해 일했습니다. 사용중인 버전에 따라 다를 수 있습니까? .NET core 3.1
— Vinni

0

이전 답변에서 언급했듯이 기본 데이터 유형 (int-> enum type) 또는 구문 분석 (string-> enum type)으로 직접 캐스트 할 수 있습니다.

그러나 열거 형에는 .TryParse가 없으므로 실패를 포착하려면 구문 분석 주위에 try / catch 블록이 필요합니다.


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 아이디어입니다

이를 통해 열거를 클래스로 정의 할 수 있습니다 (예는 vb.net에 있음).

<StringEnumRegisteredOnly (), DebuggerStepThrough (), ImmutableObject (True)> Public NotInheritable 클래스 eAuthenticationMethod는 StringEnumBase (Of 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")   

엔드 클래스

이제 열거 형을 사용할 때이 클래스를 사용할 수 있습니다 : eAuthenticationMethod.WindowsAuthentication 이것은 본질적으로 ' W '에 WindowsAuthentication 의 논리적 값 (열거 내)을 할당하는 것과 같 으며 속성 에서이 값을 볼 경우 창 (또는 System.ComponentModel.Description 속성을 사용하는 다른 항목)에 " Windows 인증 사용 "이 표시됩니다.

나는 이것을 오랫동안 오랫동안 사용해 왔으며 코드의 의도를보다 명확하게 만듭니다.


0
(MyColours)Enum.Parse(typeof(MyColours), "red", true); // MyColours.Red
(int)((MyColours)Enum.Parse(typeof(MyColours), "red", true)); // 0

-1

이 블로그 게시물의 제안 중 일부를 확인하고 싶을 수도 있습니다. 나의 새로운 작은 친구, Enum <T>

이 포스트는 매우 일반적인 제네릭 헬퍼 클래스를 생성하는 방법을 설명합니다 Enum.Parse.

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

또는 같은 게시물에서 비슷한 방법으로 확장 방법을 사용하는 방법에 대한 의견을 확인하십시오.


게시물 링크가 끊어졌습니다.
— Machado
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.