열거 형을 C #의 목록으로 어떻게 변환합니까? [복제]
이 질문에 이미 답변이 있습니다.
- 열거 형을 열거하는 방법? 27 답변
를 enum
모든 열거 형 옵션을 포함하는 목록 으로 변환하는 방법이 있습니까?
이것은 IEnumerable<SomeEnum>
Enum의 모든 값을 반환합니다 .
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
그것이되기를 원한다면 List<SomeEnum>
, 그냥 .ToList()
뒤에 추가하십시오 .Cast<SomeEnum>()
.
배열에서 Cast 함수를 사용하려면 System.Linq
using 섹션에 가 있어야합니다 .
훨씬 더 쉬운 방법 :
Enum.GetValues(typeof(SomeEnum))
.Cast<SomeEnum>()
.Select(v => v.ToString())
.ToList();
짧은 대답은 다음을 사용하는 것입니다.
(SomeEnum[])Enum.GetValues(typeof(SomeEnum))
지역 변수에 필요한 경우 var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));
.
구문이 왜 이런가요?!
이 static
방법 GetValues
은 이전 .NET 1.0 일에 다시 도입되었습니다. 런타임 유형의 1 차원 배열을 반환합니다 SomeEnum[]
. 그러나 제네릭이 아닌 메서드 (제네릭은 .NET 2.0까지 도입되지 않음)이기 때문에 반환 유형 (컴파일 시간 반환 유형)을 선언 할 수 없습니다.
.NET 배열 공분산의 종류가, 그러나 때문에 SomeEnum
될 것입니다 값 유형을 , 및 배열 형 공분산이 아닌 값 형식으로 작업을 수행하기 때문에, 그들은 심지어로 반환 유형을 선언 할 수 object[]
또는 Enum[]
. (이 예는 상이한 의 과부하 GetCustomAttributes
.NET 1.0에서 컴파일시 리턴 형을 갖는 object[]
유형의 배열을 반환하지만, 실제로는 반드시 참조 형이다.)SomeAttribute[]
SomeAttribute
이 때문에 .NET 1.0 메서드는 반환 형식을 System.Array
. 그러나 나는 그것이 SomeEnum[]
.
GetValues
동일한 열거 형 유형으로 다시 호출 할 때마다 새 배열을 할당하고 값을 새 배열에 복사해야합니다. 메서드의 "소비자"에 의해 배열이 작성 (수정) 될 수 있으므로 값이 변경되지 않도록 새 배열을 만들어야하기 때문입니다. .NET 1.0에는 좋은 읽기 전용 컬렉션이 없었습니다.
여러 곳에서 모든 값의 목록이 필요한 경우 GetValues
한 번만 호출 하고 결과를 읽기 전용 래퍼에 캐시하는 것을 고려 하십시오. 예를 들면 다음과 같습니다.
public static readonly ReadOnlyCollection<SomeEnum> AllSomeEnumValues
= Array.AsReadOnly((SomeEnum[])Enum.GetValues(typeof(SomeEnum)));
그러면 AllSomeEnumValues
여러 번 사용할 수 있으며 동일한 컬렉션을 안전하게 재사용 할 수 있습니다.
사용하는 것이 왜 나쁜 .Cast<SomeEnum>()
가요?
다른 많은 답변에서 .Cast<SomeEnum>()
. 이것의 문제점 IEnumerable
은 Array
클래스 의 비 제네릭 구현을 사용한다는 것 입니다. 이것은 해야 에 각각의 값을 관련 권투를 System.Object
상자, 다음 사용하여 Cast<>
다시 모든 값을 언 박싱하는 방법. 다행히도이 .Cast<>
메서드 는 컬렉션을 반복하기 전에 매개 IEnumerable
변수 ( this
매개 변수) 의 런타임 유형을 확인하는 것처럼 보이므로 결국 그렇게 나쁘지는 않습니다. 그것은 밝혀 .Cast<>
통해 같은 배열 인스턴스를 할 수 있습니다.
당신하여 수행하면 .ToArray()
나 .ToList()
같이 :
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this
또 다른 문제가 있습니다. 호출 할 때 새 컬렉션 (배열)을 GetValues
만든 다음 호출 로 새 컬렉션 ( List<>
) 을 만듭니다 .ToList()
. 따라서 이는 값을 보유하기 위해 전체 컬렉션의 하나 (추가) 중복 할당입니다.
LINQ를 사용하여 내가 좋아하는 방법은 다음과 같습니다.
public class EnumModel
{
public int Value { get; set; }
public string Name { get; set; }
}
public enum MyEnum
{
Name1=1,
Name2=2,
Name3=3
}
public class Test
{
List<EnumModel> enums = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => new EnumModel() { Value = (int)c, Name = c.ToString() }).ToList();
// A list of Names only, does away with the need of EnumModel
List<string> MyNames = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => c.ToString()).ToList();
// A list of Values only, does away with the need of EnumModel
List<int> myValues = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => (int)c).ToList();
// A dictionnary of <string,int>
Dictionary<string,int> myDic = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).ToDictionary(k => k.ToString(), v => (int)v);
}
도움이되기를 바랍니다.
List <SomeEnum> theList = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();
아주 간단한 대답
다음은 내 애플리케이션 중 하나에서 사용하는 속성입니다.
public List<string> OperationModes
{
get
{
return Enum.GetNames(typeof(SomeENUM)).ToList();
}
}
나는 항상 enum
다음과 같은 값 목록을 얻는 데 사용 했습니다.
Array list = Enum.GetValues(typeof (SomeEnum));
여기에 유용성을 위해 ... 값을 목록으로 가져 오는 코드로, 열거 형을 읽을 수있는 텍스트 형식으로 변환합니다.
public class KeyValuePair
{
public string Key { get; set; }
public string Name { get; set; }
public int Value { get; set; }
public static List<KeyValuePair> ListFrom<T>()
{
var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>());
return array
.Select(a => new KeyValuePair
{
Key = a.ToString(),
Name = a.ToString().SplitCapitalizedWords(),
Value = Convert.ToInt32(a)
})
.OrderBy(kvp => kvp.Name)
.ToList();
}
}
.. 및 지원 System.String 확장 메서드 :
/// <summary>
/// Split a string on each occurrence of a capital (assumed to be a word)
/// e.g. MyBigToe returns "My Big Toe"
/// </summary>
public static string SplitCapitalizedWords(this string source)
{
if (String.IsNullOrEmpty(source)) return String.Empty;
var newText = new StringBuilder(source.Length * 2);
newText.Append(source[0]);
for (int i = 1; i < source.Length; i++)
{
if (char.IsUpper(source[i]))
newText.Append(' ');
newText.Append(source[i]);
}
return newText.ToString();
}
Language[] result = (Language[])Enum.GetValues(typeof(Language))
public class NameValue
{
public string Name { get; set; }
public object Value { get; set; }
}
public class NameValue
{
public string Name { get; set; }
public object Value { get; set; }
}
public static List<NameValue> EnumToList<T>()
{
var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>());
var array2 = Enum.GetNames(typeof(T)).ToArray<string>();
List<NameValue> lst = null;
for (int i = 0; i < array.Length; i++)
{
if (lst == null)
lst = new List<NameValue>();
string name = array2[i];
T value = array[i];
lst.Add(new NameValue { Name = name, Value = value });
}
return lst;
}
Enum을 목록으로 변환 여기에서 더 많은 정보를 얻을 수 있습니다 .
private List<SimpleLogType> GetLogType()
{
List<SimpleLogType> logList = new List<SimpleLogType>();
SimpleLogType internalLogType;
foreach (var logtype in Enum.GetValues(typeof(Log)))
{
internalLogType = new SimpleLogType();
internalLogType.Id = (int) (Log) Enum.Parse(typeof (Log), logtype.ToString(), true);
internalLogType.Name = (Log)Enum.Parse(typeof(Log), logtype.ToString(), true);
logList.Add(internalLogType);
}
return logList;
}
맨 위 코드에서 Log는 Enum이고 SimpleLogType은 로그의 구조입니다.
public enum Log
{
None = 0,
Info = 1,
Warning = 8,
Error = 3
}
/// <summary>
/// Method return a read-only collection of the names of the constants in specified enum
/// </summary>
/// <returns></returns>
public static ReadOnlyCollection<string> GetNames()
{
return Enum.GetNames(typeof(T)).Cast<string>().ToList().AsReadOnly();
}
where T is a type of Enumeration; Add this:
using System.Collections.ObjectModel;
If you want Enum int as key and name as value, good if you storing the number to database and it is from Enum!
void Main()
{
ICollection<EnumValueDto> list = EnumValueDto.ConvertEnumToList<SearchDataType>();
foreach (var element in list)
{
Console.WriteLine(string.Format("Key: {0}; Value: {1}", element.Key, element.Value));
}
/* OUTPUT:
Key: 1; Value: Boolean
Key: 2; Value: DateTime
Key: 3; Value: Numeric
*/
}
public class EnumValueDto
{
public int Key { get; set; }
public string Value { get; set; }
public static ICollection<EnumValueDto> ConvertEnumToList<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new Exception("Type given T must be an Enum");
}
var result = Enum.GetValues(typeof(T))
.Cast<T>()
.Select(x => new EnumValueDto { Key = Convert.ToInt32(x),
Value = x.ToString(new CultureInfo("en")) })
.ToList()
.AsReadOnly();
return result;
}
}
public enum SearchDataType
{
Boolean = 1,
DateTime,
Numeric
}
You could use the following generic method:
public static List<T> GetItemsList<T>(this int enums) where T : struct, IConvertible
{
if (!typeof (T).IsEnum)
{
throw new Exception("Type given must be an Enum");
}
return (from int item in Enum.GetValues(typeof (T))
where (enums & item) == item
select (T) Enum.Parse(typeof (T), item.ToString(new CultureInfo("en")))).ToList();
}
참고URL : https://stackoverflow.com/questions/1167361/how-do-i-convert-an-enum-to-a-list-in-c
'Program Tip' 카테고리의 다른 글
커밋 메시지를 변경하지 않고 커밋을 수정하는 방법 (이전 메시지 재사용)? (0) | 2020.10.03 |
---|---|
IntelliJ : 와일드 카드 가져 오기 사용 안 함 (0) | 2020.10.03 |
NSString을 NSNumber로 변환하는 방법 (0) | 2020.10.03 |
Haskell의 대규모 디자인? (0) | 2020.10.03 |
JavaScript 변수를 설정 해제하는 방법은 무엇입니까? (0) | 2020.10.03 |