Program Tip

열거 형을 C #의 목록으로 어떻게 변환합니까?

programtip 2020. 10. 3. 11:33
반응형

열거 형을 C #의 목록으로 어떻게 변환합니까? [복제]


이 질문에 이미 답변이 있습니다.

enum모든 열거 형 옵션을 포함하는 목록 으로 변환하는 방법이 있습니까?


이것은 IEnumerable<SomeEnum>Enum의 모든 값을 반환합니다 .

Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();

그것이되기를 원한다면 List<SomeEnum>, 그냥 .ToList()뒤에 추가하십시오 .Cast<SomeEnum>().

배열에서 Cast 함수를 사용하려면 System.Linqusing 섹션에 가 있어야합니다 .


훨씬 더 쉬운 방법 :

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>(). 이것의 문제점 IEnumerableArray클래스 의 비 제네릭 구현을 사용한다는 것 입니다. 이것은 해야 에 각각의 값을 관련 권투를 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

반응형