C #에서 사전에 열거 형
온라인으로 검색했지만 원하는 답변을 찾을 수 없습니다.
기본적으로 다음 열거 형이 있습니다.
public enum typFoo : int
{
itemA : 1,
itemB : 2
itemC : 3
}
이 열거 형을 사전으로 변환하여 다음 사전에 저장하려면 어떻게해야합니까?
Dictionary<int,string> mydic = new Dictionary<int,string>();
그리고 mydic은 다음과 같습니다.
1, itemA
2, itemB
3, itemC
어떤 아이디어?
foreach( typFoo foo in Enum.GetValues(typeof(typFoo)) )
{
mydic.Add((int)foo, foo.ToString());
}
시험:
var dict = Enum.GetValues(typeof(typFoo))
.Cast<typFoo>()
.ToDictionary(t => (int)t, t => t.ToString() );
Ani의 답변을 일반적인 방법으로 사용할 수 있도록 수정 (감사합니다, toddmo ) :
public static Dictionary<int, string> EnumDictionary<T>()
{
if (!typeof(T).IsEnum)
throw new ArgumentException("Type must be an enum");
return Enum.GetValues(typeof(T))
.Cast<T>()
.ToDictionary(t => (int)(object)t, t => t.ToString());
}
- 연장 방법
- 기존 이름 지정
- 한 줄
- C # 7 반환 구문 (그러나 이전 레거시 버전의 C #에서는 대괄호를 사용할 수 있음)
- 덕분에
ArgumentException
유형이 아닌 경우를 던집니다.System.Enum
Enum.GetValues
- IntelliSense는 구조체로 제한됩니다 (
enum
아직 제약 조건을 사용할 수 없음 ). - 원하는 경우 열거 형을 사용하여 사전을 색인화 할 수 있습니다.
public static Dictionary<T, string> ToDictionary<T>() where T : struct
=> Enum.GetValues(typeof(T)).Cast<T>().ToDictionary(e => e, e => e.ToString());
열거 형 설명자를 열거 할 수 있습니다.
Dictionary<int, string> enumDictionary = new Dictionary<int, string>();
foreach(var name in Enum.GetNames(typeof(typFoo))
{
enumDictionary.Add((int)((typFoo)Enum.Parse(typeof(typFoo)), name), name);
}
각 항목의 값과 이름을 사전에 넣어야합니다.
Arithmomaniac의 예 를 기반으로하는 또 다른 확장 방법 :
/// <summary>
/// Returns a Dictionary<int, string> of the parent enumeration. Note that the extension method must
/// be called with one of the enumeration values, it does not matter which one is used.
/// Sample call: var myDictionary = StringComparison.Ordinal.ToDictionary().
/// </summary>
/// <param name="enumValue">An enumeration value (e.g. StringComparison.Ordianal).</param>
/// <returns>Dictionary with Key = enumeration numbers and Value = associated text.</returns>
public static Dictionary<int, string> ToDictionary(this Enum enumValue)
{
var enumType = enumValue.GetType();
return Enum.GetValues(enumType)
.Cast<Enum>()
.ToDictionary(t => (int)(object)t, t => t.ToString());
}
애니 에게 +1 . 다음은 VB.NET 버전입니다.
Ani의 대답의 VB.NET 버전은 다음과 같습니다.
Public Enum typFoo
itemA = 1
itemB = 2
itemC = 3
End Enum
Sub example()
Dim dict As Dictionary(Of Integer, String) = System.Enum.GetValues(GetType(typFoo)) _
.Cast(Of typFoo)() _
.ToDictionary(Function(t) Integer.Parse(t), Function(t) t.ToString())
For Each i As KeyValuePair(Of Integer, String) In dict
MsgBox(String.Format("Key: {0}, Value: {1}", i.Key, i.Value))
Next
End Sub
추가 예
제 경우에는 중요한 디렉토리의 경로를 저장하고 web.config
파일의 AppSettings 섹션 에 저장하고 싶었습니다 . 그런 다음 이러한 AppSettings의 키를 나타내는 열거 형을 만들었지 만 프런트 엔드 엔지니어는 외부 JavaScript 파일에서 이러한 위치에 액세스해야했습니다. 그래서 다음 코드 블록을 생성하여 기본 마스터 페이지에 배치했습니다. 이제 각각의 새 Enum 항목은 해당 JavaScript 변수를 자동으로 생성합니다. 내 코드 블록은 다음과 같습니다.
<script type="text/javascript">
var rootDirectory = '<%= ResolveUrl("~/")%>';
// This next part will loop through the public enumeration of App_Directory and create a corresponding JavaScript variable that contains the directory URL from the web.config.
<% Dim App_Directories As Dictionary(Of String, App_Directory) = System.Enum.GetValues(GetType(App_Directory)) _
.Cast(Of App_Directory)() _
.ToDictionary(Of String)(Function(dir) dir.ToString)%>
<% For Each i As KeyValuePair(Of String, App_Directory) In App_Directories%>
<% Response.Write(String.Format("var {0} = '{1}';", i.Key, ResolveUrl(ConfigurationManager.AppSettings(i.Value))))%>
<% next i %>
</script>
NOTE: In this example, I used the name of the enum as the key (not the int value).
Use:
public static class EnumHelper
{
public static IDictionary<int, string> ConvertToDictionary<T>() where T : struct
{
var dictionary = new Dictionary<int, string>();
var values = Enum.GetValues(typeof(T));
foreach (var value in values)
{
int key = (int) value;
dictionary.Add(key, value.ToString());
}
return dictionary;
}
}
Usage:
public enum typFoo : int
{
itemA = 1,
itemB = 2,
itemC = 3
}
var mydic = EnumHelper.ConvertToDictionary<typFoo>();
Using reflection:
Dictionary<int,string> mydic = new Dictionary<int,string>();
foreach (FieldInfo fi in typeof(typFoo).GetFields(BindingFlags.Public | BindingFlags.Static))
{
mydic.Add(fi.GetRawConstantValue(), fi.Name);
}
If you need only the name you don't have to create that dictionary at all.
This will convert enum to int:
int pos = (int)typFoo.itemA;
This will convert int to enum:
typFoo foo = (typFoo) 1;
And this will retrun you the name of it:
((typFoo) i).toString();
public class EnumUtility
{
public static string GetDisplayText<T>(T enumMember)
where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new Exception("Requires enum only");
var a = enumMember
.GetType()
.GetField(enumMember.ToString())
.GetCustomAttribute<DisplayTextAttribute>();
return a == null ? enumMember.ToString() : a.Text;
}
public static Dictionary<int, string> ParseToDictionary<T>()
where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new Exception("Requires enum only");
Dictionary<int, string> dict = new Dictionary<int, string>();
T _enum = default(T);
foreach(var f in _enum.GetType().GetFields())
{
if(f.GetCustomAttribute<DisplayTextAttribute>() is DisplayTextAttribute i)
dict.Add((int)f.GetValue(_enum), i == null ? f.ToString() : i.Text);
}
return dict;
}
public static List<(int Value, string DisplayText)> ParseToTupleList<T>()
where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new Exception("Requires enum only");
List<(int, string)> tupleList = new List<(int, string)>();
T _enum = default(T);
foreach (var f in _enum.GetType().GetFields())
{
if (f.GetCustomAttribute<DisplayTextAttribute>() is DisplayTextAttribute i)
tupleList.Add(((int)f.GetValue(_enum), i == null ? f.ToString() : i.Text));
}
return tupleList;
}
}
ReferenceURL : https://stackoverflow.com/questions/5583717/enum-to-dictionary-in-c-sharp
'Programing' 카테고리의 다른 글
페이스 북 오류 '인증 코드 확인 오류' (0) | 2021.01.09 |
---|---|
Android는 카메라 비트 맵의 방향을 얻습니까? (0) | 2021.01.09 |
PHP에서 CSV 파일을 업로드하고 구문 분석하는 방법 (0) | 2021.01.09 |
iOS 앱 아이콘에서 배지 제거 (0) | 2021.01.09 |
UISearchBar / 키보드 검색 버튼 제목 변경 (0) | 2021.01.09 |