programing

Enum에서 문자열을 검색하고 Enum을 반환합니다.

lastcode 2023. 7. 31. 21:26
반응형

Enum에서 문자열을 검색하고 Enum을 반환합니다.

나는 열거형이 있습니다.

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

시스템을 확인합니다.Enum.Parse:


enum Colors {Red, Green, Blue}

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

열거형에 int를 캐스팅할 수 있습니다.

(MyColour)2

Enum.Parse 옵션도 있습니다.

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

에 대한 최신 및 가장 큰 변경 사항이 주어집니다.NET(+Core) 및 C# 7, 최고의 솔루션은 다음과 같습니다.

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

색상 변수는 Enum 범위 내에서 사용할 수 있습니다.트라이파스

열거만 있으면 됩니다.구문 분석.

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

저는 오리건 고스트의 답변을 +1로 표시한 다음 반복을 사용하려고 시도했고 Enum 때문에 그것이 옳지 않다는 것을 깨달았습니다.GetNames가 문자열을 반환합니다.당신은 열거를 원합니다.값 가져오기:

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

   return MyColors.Default;
}

사용할 수 있습니다.Enum.Parse이름에서 열거값을 가져옵니다.를 사용하여 모든 값을 반복할 수 있습니다.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
}

후자는 논쟁을 던질 것입니다.예외: 값을 찾을 수 없는 경우 함수 내부에서 값을 캡처하고 기본값을 반환할 수 있습니다.

이 방법을 사용해 보십시오.

public static class Helper
{
  public static T FromStr<T>(string str) where T : struct, System.Enum
    => System.Enum.TryParse<T>(value:str,ignoreCase:true,result:out var result)
    ? result
    : default;
  public static T? FromStrNull<T>(string str) where T : struct, System.Enum
    => System.Enum.TryParse<T>(value: str,ignoreCase: true,result: out var result)
    ? result
    : null;
}

그리고 이렇게 사용합니다.

var color = Helper.FromStr<MyColours>("red");

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

하지만 조심하세요 - 없습니다.열거형에 대해 구문 분석을 시도해 보십시오. 그러면 실패를 탐지하려면 구문 분석 주위에 시도/캐치 블록이 필요합니다.

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

(지금까지 제공된 유효한 답변/좋은 답변 외에) 유용한 한 가지는 여기에 제공된 StringEnum 아이디어입니다.

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

< StringEnum RegisteredOnly(), 디버거 단계Through(), ImportableObject(True)> Public Not InheritableClass 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를 사용하는 것처럼 사용할 수 있습니다.창문들인증 및 이는 기본적으로 Windows의 논리적 값을 'W'에 할당하는 것과 같습니다.인증( 열거형 내부) 및 속성 창(또는 시스템을 사용하는 다른 창)에서 이 값을 볼 경우.구성요소 모델.설명 속성)에 "Windows 인증 사용"이 표시됩니다.

나는 이것을 오랫동안 사용해 왔고 그것은 의도적으로 코드를 더 명확하게 만듭니다.

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

다음 블로그 게시물에서 몇 가지 제안을 확인할 수도 있습니다.나의 새로운 작은 친구, Enum<T>

이 게시물은 매우 단순한 일반 도우미 클래스를 만드는 방법을 설명합니다. 이 클래스를 사용하면 고유한 추한 주조 구문을 피할 수 있습니다.Enum.Parse대신 코드에 다음과 같은 내용을 기록하게 됩니다.

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

또는 같은 게시물에 있는 댓글 중 일부를 확인해 보십시오. 이 댓글들은 비슷한 방법으로 확장하는 방법을 사용하는 것에 대해 이야기합니다.

언급URL : https://stackoverflow.com/questions/2290262/search-for-a-string-in-enum-and-return-the-enum

반응형