Подтвердить что ты не робот

Как установить пространство на Enum

Я хочу установить пробел в моем перечислении. Вот мой пример кода:

public enum category
{
    goodBoy=1,
    BadBoy
}

Я хочу установить

public enum category
{
    Good Boy=1,
    Bad Boy  
}

Когда я возвращаюсь, я хочу увидеть результат Хороший мальчик из перечисления

4b9b3361

Ответ 1

Вы можете украсить свои значения Enum с помощью DataAnnotations, поэтому верно следующее:

using System.ComponentModel.DataAnnotations;

public enum Boys
{
    [Display(Name="Good Body")]
    GoodBoy,
    [Display(Name="Bad Boy")]
    BadBoy
}

Я не уверен, что UI Framework вы используете для своих элементов управления, но ASP.NET MVC может читать DataAnnotations при вводе HTML.LabelFor в представлениях Razor.

Здесь используется метод расширения

Если вы не используете представления Razor или хотите получить имена в коде:

public class EnumExtention
{
    public Dictionary<int, string> ToDictionary(Enum myEnum)
    {
        var myEnumType = myEnum.GetType();
        var names = myEnumType.GetFields()
            .Where(m => m.GetCustomAttribute<DisplayAttribute>() != null)
            .Select(e => e.GetCustomAttribute<DisplayAttribute>().Name);
        var values = Enum.GetValues(myEnumType).Cast<int>();
        return names.Zip(values, (n, v) => new KeyValuePair<int, string>(v, n))
            .ToDictionary(kv => kv.Key, kv => kv.Value);
    }
}

Затем используйте его:

Boys.GoodBoy.ToDictionary()

Ответ 2

Вы неправильно понимаете, для чего используется переименование. Перечисление предназначено для программирования, по сути давая имя числу. Это полезно для программиста при чтении исходного кода.

status = StatusLevel.CRITICAL; // this is a lot easier to read...
status = 5;                    // ...than this

Перечисления не предназначены для показа и не должны отображаться конечному пользователю. Как и любая другая переменная, перечисления не могут использовать пробелы в именах.

Чтобы связать внутренние значения с яркими ярлыками, которые вы можете отобразить для пользователя, можете использовать словарь или хэш.

myDict["Bad Boy"] = "joe blow";

Ответ 3

Подумайте, что это может быть уже рассмотрено, некоторые предложения:

Просто не могу победить stackoverflow;) просто так много здесь сегодня.

Ответ 4

using System.ComponentModel;

то...

public enum category
{
    [Description("Good Boy")]
    goodboy,
    [Description("Bad Boy")]
    badboy
}

решаемые!!

Ответ 5

Это невозможно, перечислитель не может содержать пробел в своем имени.

Ответ 6

Почему бы вам не использовать ToString()?

Я имею в виду, что при использовании ToString() он дает значение перечисления. Просто вам нужно добавить некоторый идентификатор, чтобы ловить пробел. Например:

public enum category
{
   good_Boy=1,
   Bad_Boy
}

Когда вы получаете перечисление в таких кодах, как категория a =..., вы можете использовать метод ToString(). Это дает вам значение как строку. После этого вы можете просто изменить _ на пустую строку.

Ответ 7

Разрабатывая обходное решение user14570 (nice), упомянутое выше, здесь приведен полный пример:

    public enum MyEnum
    {
        My_Word,
        Another_One_With_More_Words,
        One_More,
        We_Are_Done_At_Last
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            IEnumerable<MyEnum> values = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
            List<string> valuesWithSpaces = new List<string>(values.Select(v => v.ToString().Replace("_", " ")));

            foreach (MyEnum enumElement in values)
                Console.WriteLine($"Name: {enumElement}, Value: {(int)enumElement}");

            Console.WriteLine();
            foreach (string stringRepresentation in valuesWithSpaces)
                Console.WriteLine(stringRepresentation);
        }
    }

Выход:

введите описание изображения здесь

Ответ 8

С# теперь имеет встроенную функцию для получения описания из перечисления. Вот как это работает

Мой Enum:

using System.ComponentModel.DataAnnotations;

public enum Boys
{
[Description("Good Boy")]
GoodBoy = 1,
[Description("Bad Boy")]
BadBoy = 2
}

Это как получить описание в коде

var enumValue = Boys.GoodBoy;
string stringValue = enumValue.ToDescription();

Результат: хороший мальчик.

Ответ 9

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

string.Join(" ", Regex.Split(v.ToString(), @"(?<!^)(?=[A-Z])"));

Сначала получите значения перечисления:

var values = Enum.GetValues(typeof(Category));

Затем переберите значения и используйте приведенный выше код, чтобы получить значения:

var ret = new Dictionary<int, string>();

foreach (Category v in values)
{
   ret.Add((int)v, string.Join(" ", Regex.Split(v.ToString(), @"(?<!^)(?=[A-Z])")));
} 

В моем случае мне нужен был словарь со значением и отображаемым именем, поэтому у меня есть переменная "ret"

Ответ 10

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

Я использовал аннотации и вспомогательный метод расширения.

Определение перечисления:

internal enum TravelClass
{
    [Description("Economy With Restrictions")]
    EconomyWithRestrictions,
    [Description("Economy Without Restrictions")]
    EconomyWithoutRestrictions
}

Определение класса расширения:

internal static class Extensions
{
    public static string ToDescription(this Enum value)
    {
        FieldInfo field = value.GetType().GetField(value.ToString());
        DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
        return attribute == null ? value.ToString() : attribute.Description;
    }
}

Пример использования enum:

var enumValue = TravelClass.EconomyWithRestrictions;
string stringValue = enumValue.ToDescription();

Это вернет Economy With Restrictions.

Надеюсь, что это поможет людям в качестве полного примера. Еще раз, кредит идет на Smac за эту идею, я только что завершил ее с помощью метода расширения.

Ответ 11

У вас не может быть перечисление с пробелами в .Net. Это было возможно с более ранними версиями VB и С++, но не более того. Я помню, что в VB6 я использовал их в квадратных скобках, но не в С#.

Ответ 12

Поскольку исходный вопрос запрашивал добавление пробела в значение enum/name, я бы сказал, что символ подчеркивания должен быть заменен пробелом, а не пустой строкой. Однако наилучшим решением является использование аннотаций.

Ответ 13

Перечислитель не может содержать пробел в своем имени.

Как известно, enum - это ключевое слово, используемое для объявления перечисления.

вы можете проверить эту ссылку https://msdn.microsoft.com/en-us/library/sbbt4032.aspx

Ответ 14

public enum MyEnum { With_Space, With_Two_Spaces } //I store spaces as underscore. Actual values are 'With Space' and 'With Two Spaces'

public MyEnum[] arrayEnum = (MyEnum[])Enum.GetValues(typeof(MyEnum));

string firstEnumValue = String.Concat(arrayEnum[0].ToString().Replace('_', ' ')) //I get 'With Space' as first value
string SecondEnumValue = String.Concat(arrayEnum[1].ToString().Replace('_', ' ')) //I get 'With Two Spaces' as second value