C#에서 열거를 목록으로 변환하려면 어떻게 해야 합니까?
변환할 수 있는 방법이 있습니까?enum
모든 열거형 옵션이 포함된 목록으로?
이 옵션은 다음을 반환됩니다.IEnumerable<SomeEnum>
모든 Enum 값 중에서.
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
만약 당신이 그것이 되기를 원한다면.List<SomeEnum>
그냥추를 추가합니다..ToList()
나고끝 .Cast<SomeEnum>()
.
배열에서 캐스트 기능을 사용하려면 다음이 필요합니다.System.Linq
를 참조하십시오.
훨씬 쉬운 방법:
Enum.GetValues(typeof(SomeEnum))
.Cast<SomeEnum>()
.Select(v => v.ToString())
.ToList();
간단한 대답은 다음과 같습니다.
(SomeEnum[])Enum.GetValues(typeof(SomeEnum))
당신이 변수에 그것이 하다면, 만약당지변그수필것면다요그, 은것하이입니다.var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));
.
구문이 왜 이런 거지?!
그static
메서드는 이전 .NET 1.0일에 도입되었습니다.런타임 유형의 1차원 배열을 반환합니다.SomeEnum[]
그러나 일반적이지 않은 방법(.NET 2.0 이전에는 일반적이지 않은 방법)이기 때문에 반환 유형(컴파일 시간 반환 유형)을 그렇게 선언할 수 없습니다.
, 왜냐하면 .NET 배열은 .NET 형식이기 때문입니다.SomeEnum
값 유형이 될 것이며 배열 유형 공분산은 값 유형과 함께 작동하지 않기 때문에 반환 유형을 다음으로 선언할 수도 없습니다.object[]
또는Enum[]
(이는 컴파일 시간 반환 유형을 가진 .NET 1.0의 오버로드와는 다릅니다.object[]
는 형식의 배열을 반환합니다.SomeAttribute[]
SomeAttribute
반드시 참조 유형이어야 합니다.)
에 . 1을 .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>()
?
대답들은 많은다답사이다용니합들변른다사니▁use▁a▁lot용합 사용합니다..Cast<SomeEnum>()
이지 않은 는▁the를 한다는 것입니다.IEnumerable
의 Array
수업. 이것은 각각의 가치들을 권투로 만드는 것을 포함했어야 합니다.System.Object
상자를 선택한 다음 사용합니다.Cast<>
모든 값의 상자를 다시 여는 방법입니다.운 좋게도..Cast<>
메소드는 런타임 유형을 확인하는 것 같습니다.IEnumerable
매개 변수(the)this
parameter)는 컬렉션을 통해 반복하기 전에 발생하기 때문에 결국 그렇게 나쁘지 않습니다.알고 보니.Cast<>
동일한 어레이 인스턴스를 통과할 수 있습니다.
만약 당신이 그것을 따른다면,.ToArray()
또는.ToList()
다음과 같이:
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this
또 다른 문제를 있습니다: " 다른문있습니다가제또다".".".".호할때어새을컬만션(어레이)듭다를 부를 때 어레이)을.GetValues
새.List<>
)와 함께 께함와께.ToList()
call (, 값, 유지하기위해체전렉을컬중복것즉션다할입는니당.
업데이트: .NET 5.0(2020년부터) 이후로 위의 정보는 더 이상 사용되지 않습니다. 마침내 일반적인 방법(2005년부터 .NET Framework 2.0과 함께 도입된 일반적인 방법)이 있으므로 이제 다음을 사용하면 됩니다.
Enum.GetValues<SomeEnum>()
입력된 것(「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」로 입력)SomeEnum[]
).
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();
}
}
및 지원 시스템.문자열 확장 메서드:
/// <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;
}
상위 코드에서 로그는 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();
}
여기서 T는 Enumeration의 한 유형입니다. 추가:
using System.Collections.ObjectModel;
Enumint를 키로 사용하고 name을 값으로 사용하려면 숫자를 데이터베이스에 저장하고 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
}
다음과 같은 일반적인 방법을 사용할 수 있습니다.
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
'programing' 카테고리의 다른 글
AzureBob 업로드 오류: 지정한 BLOB가 이미 있습니다. (0) | 2023.05.28 |
---|---|
해결 방법: "현재 중단점이 적용되지 않습니다.이 문서에 대한 기호가 로드되지 않았습니다." 경고? (0) | 2023.05.28 |
SQL Server 2008이 새로 생성된 사용자로 로그인할 수 없음 (0) | 2023.05.28 |
git-mv의 목적은 무엇입니까? (0) | 2023.05.28 |
jQuery를 사용하여 롤오버 시 이미지 소스 변경 (0) | 2023.05.28 |