2013-02-22 3 views
6

У меня есть перечислениеполучить значение из C# перечислений

public enum ProductionStatus { 
    Received = 000, 
    Validated = 010, 
    PlannedAndConverted = 020, 
    InProduction = 030, 
    QAChecked = 040, 
    Delivered = 070, 
    RejectedOrCancelled = 100 
} 

Мне нужно получить значение по ключу из этого перечисления, например, при выборе ProductionStatus.Validated он должен вернуть 010. Как я могу это сделать?

+0

Ваша схема нумерации выглядит странно. вы уверены, что хотите, чтобы они были int, а не восьмеричными? Этот набор номера также вызывает FlagsAttribute. –

+1

Ваш вопрос ясный для меня. Вы хотите иметь строку «010» или значение ProductionStatus.Validated as int? Оба случая находятся в моем ответе. Если вы хотите что-то еще, просто напишите это четко. –

ответ

7

Просто бросить еще одно решение там ...

((int)ProductionStatus.Validated).ToString("D3"); 
+0

Спасибо, это работает. –

3
var code = (int)ProductionStatus.Validated; 

Вы также можете преобразовать Int в значение перечисления, например:

var status = (ProductionStatus)10; 

bool eq = 010 == 10; они фактически равны

Если вы хотите использовать строки, используйте этот метод.

static string EnumToString(ProductionStatus val) 
    { 
     switch (val) 
     { 
      case ProductionStatus.Received: 
       return "000"; 
      case ProductionStatus.Validated: 
       return "010"; 
      case ProductionStatus.PlannedAndConverted: 
       return "020"; 
      default: 
       return "Unknown value"; 
     } 
    } 
+0

Нет, он вернет 10, но мне нужно 010. Так что мне нужно разобрать его на строку, но не могу узнать, как это сделать, не разобрав его сначала. –

+1

Затем вам нужно использовать строки. Вы не можете использовать только числовой тип, чтобы включить форматирование, подобное этому. Число - это просто число. –

+0

okey, я думал, что могу напрямую разобрать его на строку. Спасибо за помощь. –

1
var enumValues = Enum.GetValues(typeof(ProductionStatus)).Cast<object>() 
           .ToDictionary(enumValue => enumValue.ToString(), enumValue => (int)enumValue); 

foreach (var enumValue in enumValues) 
{ 
    Console.WriteLine("item: {0}, value: {1}", enumValue.Key, enumValue.Value.ToString("000"); 
} 

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

+0

Почему -1? Это позволит получить все значения enum в словаре, а затем вы можете получить ключ. Это именно то, что было задано. –

1

В целом существует Enum Class, который содержит множество методов, облегчающих работу с перечислениями.

Здесь, если вы хотите, чтобы бросить перечислимую значение в целое или другого типа, вы можете написать:

int validatedAsInt = (int) ProductionStatus.Validated 

validatedAsInt будет содержать значение ProductionStatus.Validated.

Если вы хотите получить номера, как "010" вы можете написать:

string validatedAsString = ((int) ProductionStatus.Validated).ToString("000"); 

Или:

string validatedAsString = ((int) ProductionStatus.Validated).ToString("D3"); 

validatedAsString будет содержать "010".

4

с форматированием:

((int)ProductionStatus.Validated).ToString("000", CultureInfo.InvariantCulture); 

Это короткое и простым, и он возвращает строку.

Вы можете фактор, что в метод расширения, если вам нравится

public static class ProdStatusExtensions { 
    public static string (this ProductionStatus status) { 
     return ((int)status).ToString ("000", CultureInfo.InvariantCulture); 
    } 
} 
+1

, если вы отформатируете его с помощью ###, он фактически возвращает «10». – Alex

+0

Да, я набрал его слишком быстро. исправлено. –

+0

вам не хватает скобки после проверки. Невозможно отредактировать сообщение, так как оно меньше 6 символов :( – markoo

1

Вот универсальный вспомогательный класс, который будет делать обратное действие - получение ключа по значению из любого Enum:

public static class EnumHelpers { 

    public static T GetEnumObjectByValue<T>(int valueId) { 
    return (T) Enum.ToObject(typeof (T), valueId); 
    } 

} 

И это работает как это - учитывая мы это Enum :

public enum ShipmentStatus { 
    New = 0, 
    Shipped = 1, 
    Canceled = 2 
} 

Итак, для получения Enum объект ShipmentStatus.Shipped это вернет этот объект:

var enumObject = EnumHelpers.GetEnumObjectByValue<ShipmentStatus>(1); 

Так basicaly вы можете вставить любой объект Enum и получить его значение:

var enumObject = EnumHelpers.GetEnumObjectByValue<YOUR_ENUM_TYPE>(VALUE); 
Смежные вопросы