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
'programing' 카테고리의 다른 글
Node.js HTTP 서버를 사용하여 단일 쿠키 가져오기 및 설정 (0) | 2023.08.05 |
---|---|
배경 이미지와 불투명도를 동일한 속성으로 설정할 수 있습니까? (0) | 2023.07.31 |
파일이 없는 경우 파일 만들기 (0) | 2023.07.31 |
단일 스레드, 비OS, 임베디드 애플리케이션에서 글로벌 변수가 무엇입니까? (0) | 2023.07.31 |
memcpy 구현을 제공하는 방법 (0) | 2023.07.31 |