2013-02-22 1 views
6

Mam enumuzyskać wartość z C# teksty stałe

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

Potrzebuję uzyskać wartość o kluczu z tego wyliczenia, na przykład przy wyborze ProductionStatus.Validated powinien powrócić 010. W jaki sposób można to zrobić?

+0

Twój schemat numeracji wygląda dziwnie. czy na pewno chcesz, aby były to int, a nie ósemki? Ten zestaw numerów również wymaga użycia flagi. –

+1

Twoje pytanie jest dla mnie oczywiste. Chcesz mieć ciąg "010" lub wartość ProductionStatus.Validated jako int? Oba przypadki są w mojej odpowiedzi. Jeśli chcesz czegoś innego, po prostu napisz to wyraźnie. –

Odpowiedz

7

Wystarczy rzucić inne rozwiązanie tam ...

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

Dzięki, to działa. –

3
var code = (int)ProductionStatus.Validated; 

Można również konwertować int na wartość enum, podobnie jak to:

var status = (ProductionStatus)10; 

bool eq = 010 == 10; rzeczywistości są równe

Jeśli chciałbyś używać strun, korzystać z tej metody.

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

Nie, to zwróci 10, ale potrzebuję 010. Więc muszę sparsować go do napisu, ale nie mogę się dowiedzieć, jak to zrobić, bez wcześniejszej analizy int. –

+1

Następnie musisz użyć ciągów. Nie możesz użyć typu numerycznego, aby dołączyć takie formatowanie. Liczba to tylko liczba. –

+0

Okey, Myślałem, że mogę bezpośrednio sparsować go do ciąg znaków jakoś. Dzięki za pomoc. –

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"); 
} 

można uzyskać wszystkie wartości i nazw z wyliczenia jak tak.

+0

Dlaczego -1? To spowoduje, że wszystkie wartości wyliczenia znajdą się w słowniku, a następnie uzyskasz klucz. Właśnie o to pytano. –

1

Ogólnie rzecz biorąc istnieje Enum Class, który zawiera szereg metod ułatwiających pracę z wyliczeniami.

Tutaj, jeśli chcesz rzucić wartość enumerable do całkowitej lub innego rodzaju, można napisać:

int validatedAsInt = (int) ProductionStatus.Validated 

validatedAsInt będzie zawierać wartość ProductionStatus.Validated.

Jeśli chcesz otrzymać numery jak "010" można napisać:

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

czyli

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

validatedAsString zawierać będzie "010".

4

formatowania:

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

To krótka i prosta, i zwraca ciąg znaków.

Można czynnikiem, który w metodę rozszerzenia, jeśli chcesz

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

jeśli sformatujesz go za pomocą ###, to faktycznie zwróci "10". – Alex

+0

Tak, napisałem to zbyt szybko. naprawiony. –

+0

brakuje podpórki po sprawdzeniu poprawności. Nie można edytować postu, ponieważ jest mniej niż 6 znaków :( – markoo

1

Oto uniwersalna klasa pomocnika że zrobi odwrócić działania - uzyskanie klucza o wartości od JAKIEJKOLWIEK Enum:

public static class EnumHelpers { 

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

} 

I to działa w ten sposób - biorąc pod uwagę mamy ten Enum :

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

Tak więc, aby uzyskać Enum Przedmiotem ShipmentStatus.Shipped ten powróci obiektu:

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

Więc basicaly można trzymać żadnych przedmiotów Enum i dostać go przez wartość:

var enumObject = EnumHelpers.GetEnumObjectByValue<YOUR_ENUM_TYPE>(VALUE);