programing

C#에서 열거를 목록으로 변환하려면 어떻게 해야 합니까?

padding 2023. 5. 28. 20:25
반응형

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를 한다는 것입니다.IEnumerableArray수업. 이것은 각각의 가치들을 권투로 만드는 것을 포함했어야 합니다.System.Object상자를 선택한 다음 사용합니다.Cast<>모든 값의 상자를 다시 여는 방법입니다.운 좋게도..Cast<>메소드는 런타임 유형을 확인하는 것 같습니다.IEnumerable매개 변수(the)thisparameter)는 컬렉션을 통해 반복하기 전에 발생하기 때문에 결국 그렇게 나쁘지 않습니다.알고 보니.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

반응형