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.