C # - Определить ConsoleKey на основе строкового значения [duplicate]

Мне нужно было сделать это с огромным списком, и дублирование списка показалось вам дорогостоящим, тем более что в моем случае количество удалений будет немного по сравнению с остальными. Я использовал этот низкоуровневый подход.

array = [lots of stuff]
arraySize = len(array)
i = 0
while i < arraySize:
    if someTest(array[i]):
        del array[i]
        arraySize -= 1
    else:
        i += 1

Я не знаю, насколько эффективно несколько удалений сравниваются с копированием большого списка. Прокомментируйте, если у вас есть понимание.

43
задан ChrFin 9 May 2014 в 12:56
поделиться

8 ответов

Я думаю, вы забыли определение родового типа:

public T GetEnumValue<T>(int intValue) where T : struct, IConvertible // <T> added

, и вы можете улучшить его, чтобы он был наиболее удобным, например:

public static T ToEnum<T>(this string enumValue) : where T : struct, IConvertible
{
    return (T)Enum.Parse(typeof(T), enumValue);
}

, после чего вы можете сделать:

TestEnum reqValue = "Value1".ToEnum<TestEnum>();
1
ответ дан ChrFin 4 September 2018 в 06:49
поделиться

Существует множество способов сделать это, но если вы хотите простой пример, это будет сделано. Его просто необходимо улучшить с помощью необходимого защитного кодирования для проверки безопасности типа и недействительного разбора и т. Д.

    /// <summary>
    /// Extension method to return an enum value of type T for the given string.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static T ToEnum<T>(this string value)
    {
        return (T) Enum.Parse(typeof(T), value, true);
    }

    /// <summary>
    /// Extension method to return an enum value of type T for the given int.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static T ToEnum<T>(this int value)
    {
        var name = Enum.GetName(typeof(T), value);
        return name.ToEnum<T>();
    }
12
ответ дан David Spenard 4 September 2018 в 06:49
поделиться

Попробуйте что-то вроде этого

  public static TestEnum GetMyEnum(this string title)
        {    
            EnumBookType st;
            Enum.TryParse(title, out st);
            return st;          
         }

Итак, вы можете сделать

TestEnum en = "Value1".GetMyEnum();
0
ответ дан huMpty duMpty 4 September 2018 в 06:49
поделиться

Нет, вам не нужен общий метод. Это намного проще:

MyEnum enum = (MyEnum)myInt;

MyEnum enum = (MyEnum)Enum.Parse(typeof(TestEnum), myString);

Я думаю, что это также будет быстрее.

77
ответ дан Kendall Frey 4 September 2018 в 06:49
поделиться

Из базы данных SQL get enum like:

SqlDataReader dr = selectCmd.ExecuteReader();
while (dr.Read()) {
   EnumType et = (EnumType)Enum.Parse(typeof(EnumType), dr.GetString(0));
   ....         
}
1
ответ дан RFE Petr 4 September 2018 в 06:49
поделиться

Может быть намного проще, если вы используете методы TryParse или Parse и ToObject.

public static class EnumHelper
{
    public static  T GetEnumValue<T>(string str) where T : struct, IConvertible
    {
        Type enumType = typeof(T);
        if (!enumType.IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }
        T val;
        return Enum.TryParse<T>(str, true, out val) ? val : default(T);
    }

    public static T GetEnumValue<T>(int intValue) where T : struct, IConvertible
    {
        Type enumType = typeof(T);
        if (!enumType.IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }

        return (T)Enum.ToObject(enumType, intValue);
    }
}

Как отмечено в комментариях @chrfin, вы можете сделать это методом расширения очень легко просто добавив this до типа параметра, который может быть удобен.

9
ответ дан Sriram Sakthivel 4 September 2018 в 06:49
поделиться

Ниже приведен метод в C # для получения значения перечисления по строке

    ///
    /// Method to get enumeration value from string value.
    ///
    ///
    ///

    public T GetEnumValue<T>(string str) where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }
        T val = ((T[])Enum.GetValues(typeof(T)))[0];
        if (!string.IsNullOrEmpty(str))
        {
            foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
            {
                if (enumValue.ToString().ToUpper().Equals(str.ToUpper()))
                {
                    val = enumValue;
                    break;
                }
            }
        }

        return val;
    }

. Ниже приведен метод в C # для получения значения enum значением int.

    ///
    /// Method to get enumeration value from int value.
    ///
    ///
    ///

    public T GetEnumValue<T>(int intValue) where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum)
        {
            throw new Exception("T must be an Enumeration type.");
        }
        T val = ((T[])Enum.GetValues(typeof(T)))[0];

        foreach (T enumValue in (T[])Enum.GetValues(typeof(T)))
        {
            if (Convert.ToInt32(enumValue).Equals(intValue))
            {
                val = enumValue;
                break;
            }             
        }
        return val;
    }

Если у меня есть перечисление следующим образом:

public enum TestEnum
    {
        Value1 = 1,
        Value2 = 2,
        Value3 = 3
    }

, то я могу использовать вышеуказанные методы как

TestEnum reqValue = GetEnumValue<TestEnum>("Value1");  // Output: Value1
TestEnum reqValue2 = GetEnumValue<TestEnum>(2);       // OutPut: Value2

Надеюсь, это поможет.

3
ответ дан Stuy1974 4 September 2018 в 06:49
поделиться

Попробуйте это

. Это другой способ

public enum CaseOriginCode
    {
        Web = 0,
        Email = 1,
        Telefoon = 2
    }

public void setCaseOriginCode(string CaseOriginCode)
{
    int caseOriginCode = (int)(CaseOriginCode)Enum.Parse(typeof(CaseOriginCode), CaseOriginCode);
}

Это комментарий для вашей статьи

1
ответ дан user 4 September 2018 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: