Ім'я рядкового переліку від значення


407

У мене є така конструкція enum:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

У моїй базі перерахування посилаються на значення. Моє запитання полягає в тому, як я можу повернути числове представлення перерахунку до імені рядка.

Наприклад, з огляду 2на результат повинен бути Visible.


25
Я вважаю, що зараз є простіший спосіб зробити це за допомогою VS 2015 nameof(EnumDisplayStatus.Visible)Сподіваюся, що це комусь допоможе
Габріель Маріус Попеску

Відповіді:


542

Ви можете перетворити intспинку до члена перерахунку простим складом, а потім зателефонувати ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

13
Оновлення: лише певні перевантаження за допомогою IFormatProvider застаріли. ToString () чудово. Дивіться groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM

Яка поведінка у випадку enum Foo { A = 1, B= 1 }?
dbkk

3
В документації @dbkk зазначено, що стосовно перерахунків "ваш код не повинен робити жодних припущень щодо того, який рядок буде повернуто". через точну ситуацію, яку ви цитуєте. дивіться msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra


4
коротше: var stringValue = ((EnumDisplayStatus) значення) .ToString ()
redwards510

188

Якщо вам потрібно отримати рядок "Visible"без отримання EnumDisplayStatusекземпляра, ви можете зробити це:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

5
Якщо ви щодо відповіді Мандоліна є неточність: Enum.GetName повертає рядок, а не Enum
algreat

Це використовує відображення чи компілятор створює допоміжний словник для використання поза кадром?
palswim

155

Спробуйте це:

string m = Enum.GetName(typeof(MyEnumClass), value);

@nilco ця відповідь хороша, але я віддаю перевагу відповіді Кента, головним чином тому, що у мене є спеціальний атрибут на моїй перерахунку "Опис". Потім у мене є розширення enum, щоб отримати опис - це для відображення на екрані для користувача.
Хараг

60

Використовуй це:

string bob = nameof(EnumDisplayStatus.Visible);

9
C # 6+ потрібно, однак.
Адам К Дін

10
@AZChad це чудова річ, що потрібно знати; але це не реально застосувати в сценарії операційного, так як значення надходять з бази даних (так: у час виконання, а НЕ у час компіляції, значення)
Марк Gravell

22

ви можете просто кинути його

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

ах .. Кент побив мене до цього :)


Тепер Кент отримує всі представники "першої відповіді". Гарний Кент! : p
Метт Кокай

12

БД до C #

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

C # до БД

string dbStatus = ((int)status).ToString();

12

РІШЕННЯ:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

Також використання GetName краще, ніж явне кастинг Enum .

[Код для показника ефективності]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[Зразок результату]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002

2
Це копія відповіді 7 років. Чи можете ви пояснити, чому ваш кращий за оригінал?
nvoigt

@nvoigt Оскільки, якщо я маю рацію, API ToString () в Enum тепер застарів. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V

Отже ... принаймні дві інші відповіді вже надають код, який ви опублікували. Що надає ваші пропозиції від Mandoleen чи algreat?
nvoigt

@nvoigt Вони не згадували про його продуктивність порівняно з явним кастингом. Чи достатньо, щоб вам сподобалась моя відповідь? : p Все одно дякую, сподіваюся, що комусь це допоможе. :)
Naveen Kumar V

У нас, здається, є проблеми із спілкуванням. Ви перебуваєте на мобільному пристрої чи, можливо, ви не прокрутили досить далеко? Є дві точні копії вашої відповіді з 7 років тому. Я назвав відповідачів, тому їх слід легко знайти. Що дає Ваша відповідь, яка вже тут не принаймні 7 років?
nvoigt

9

Найшвидше, компільоване тимчасове рішення, використовуючи nameof вирази .

Повертає буквальний перелік.

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

Примітка:

  • Ви не хочете називати переліків у великому регістрі, але використовувались для демонстрації чутливості до регістру nameof.

Це повинна була відповісти.
Вболівальник LinPy

@LinPyfan Радий, що це працює добре! Це порівняно нове порівняно з датою проведення ОП.
Жни

4

Просто потрібно:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"

1
в більшості випадків це в значній мірі ідентично верхній відповіді 10 років тому; додавання "f"специфікатора є нюансованим, і може бути, а може і не бути тим, що бажаючий хоче (це залежить від того, чого вони хочуть): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Марк Гравелл

Я не звернув уваги на дату ага. Я думаю, що добре оновити трохи старого рішення, як це. Я не буду останнім, хто відкрив цю сторінку. І дякую за вашу акуратність! :)
Al3x_M

3

Для отримання значення String [Ім'я]:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

А для отримання значення enum:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));

Чому б не просто .ToString ()? 'facepalm'
MeTitus

3

я використав цей код, наведений нижче

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()

1

Просто додайте int до типу перерахування:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.