2012-12-05 9 views
14

Czy można połączyć wiele wyliczeń razem? Poniżej znajduje się przykładowy kod, co chciałbym zobaczyć:Połączyć wiele wyliczeń do głównej listy wyliczeniowej

enum PrimaryColors 
{ 
    Red, 
    Yellow, 
    Blue 
} 

enum SecondaryColors 
{ 
    Orange, 
    Green, 
    Purple 
} 

//Combine them into a new enum somehow to result in: 
enum AllColors 
{ 
    Red, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

Nie ma znaczenia w jakiej kolejności są, lub jakie są ich numery podkładowe są, po prostu chcę, aby móc je połączyć.

Dla kontekstu jest to tak, że wiele klas dla programu, nad którym pracuję, będzie zawierać wyliczenia powiązane z tym, co robią. Mój główny program odczytałby wszystkie wyliczenia dostępne z każdej z klas wsparcia i utworzył główną listę dostępnych wyrażeń dostępnych poleceń (do których przypisane są wyliczenia).

Edycja: Edycja: Powód tych wyliczeń jest taki, że mój program główny odczytuje listę poleceń do wykonania w określonym czasie, dlatego chcę przeczytać w pliku, sprawdzić, czy polecenie w nim jest powiązane z jednym moich wyrażeń, a jeśli tak, umieść go na liście poleceń do wykonania.

+2

'enum' jest fundamentalnie pojęciem czasu kompilacji. Czy chcesz utworzyć plik C# zawierający definicję czegoś podobnego do 'AllColors', czy próbujesz zrobić coś innego? – dasblinkenlight

+0

Czy próbujesz tworzyć programowo kombinowany typ 'AllColors', to znaczy, nie tworzyć go do momentu uruchomienia aplikacji? Jeśli chcesz tylko dodać je do listy, pamiętaj, że wszystkie wyliczenia mają klasy "System.Object" i "System.Enum" jako ich klasy bazowe. Możesz utworzyć listę na podstawie jednej z tych klas. Twoje wartości wyliczeniowe byłyby oczywiście zakodowane, ale to prawdopodobnie nie jest problem. –

+1

Dlaczego ograniczasz się do 'wyrażeń'? –

Odpowiedz

3

Nie jestem pewien, czy rozumiem dokładnie. Ale można zrobić List<> wszystkich wartości, takich jak ten:

var allColors = new List<Enum>(); 

allColors.AddRange(Enum.GetValues(typeof(PrimaryColors)).Cast<Enum>()); 
allColors.AddRange(Enum.GetValues(typeof(SecondaryColors)).Cast<Enum>()); 

Zamiast List<Enum> można też użyć HashSet<Enum>. W każdym razie, ponieważ przypisujesz PrimaryColor lub SecondaryColor do typu (czyli System.Enum), otrzymujesz boxing, ale to tylko szczegół techniczny (prawdopodobnie).

+0

BTW, 'HashSet' najprawdopodobniej nie ma sensu tutaj jako optymalizacji wydajności. Ale może to mieć sens, jeśli używasz go, aby uczynić cel bardziej przejrzystym. – svick

+0

Ten kod nie działa, gdy go wypróbowałem. W przykładowym programie opartym na tym, dostałem błędy: 'Najlepsze przeciążone dopasowanie metody dla 'System.Collections.Generic.List .AddRange (System.Collections.Generic.IEnumerable )' ma pewne nieprawidłowe argumenty' i' Argument 1: nie można przekonwertować z 'System.Collections.Generic.IEnumerable ' na 'System.Collections.Generic.IElicznie ' ' – Xantham

+0

@Xantham Przepraszam, ponownie zredagowałem swoją odpowiedź. –

6

Powodem tych teksty stałe jest bo mój główny program jest czytanie na liście poleceń do wykonania w określonym czasie, a więc chcę czytać w pliku, sprawdzić, czy polecenie jest powiązany z jednym z moje wyliczenia, a jeśli tak, umieść je na liście poleceń do wykonania.

Wydaje się, że nie chcesz trzy różne typy enum, chcesz jeden rodzaj (co nazywamy „mistrz enum”) plus jakiś sposób, aby zdecydować, które z sub-teksty stałe pewna wartość należy. Aby to zrobić, możesz użyć zbioru wartości z głównego wyliczenia lub switch.

Na przykład:

enum Color 
{ 
    Red, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

bool IsPrimaryColor(Color color) 
{ 
    switch (color) 
    { 
    case Color.Red: 
    case Color.Yellow: 
    case Color.Blue: 
     return true; 
    default: 
     return false; 
    } 
} 

Również you should use a singular name for enum types (o ile nie jest to flaga enum).

1

Keep it simple i po prostu korzystać z ukrytych int konwersji lub użyj System.Enum.Parse() funkcję:

enum PrimaryColors 
{   
    Red = 0, 
    Yellow = 2, 
    Blue = 4 
} 

enum SecondaryColors 
{ 
    Orange = 1, 
    Green = 3, 
    Purple = 5 
} 

//Combine them into a new enum somehow to result in: 
enum AllColors 
{ 
    Red = 0, 
    Orange, 
    Yellow, 
    Green, 
    Blue, 
    Purple 
} 

class Program 
{ 
    static AllColors ParseColor(Enum color) 
    { 
     return ParseColor(color.ToString()); 
    } 
    static AllColors ParseColor(string color) 
    { 
     return (AllColors)Enum.Parse(typeof(AllColors), color); 
    } 
    static void Main(string[] args) 
    { 
     PrimaryColors color1=PrimaryColors.Red; 
     AllColors result=(AllColors)color1; 
     // AllColors.Red 

     SecondaryColors color2=SecondaryColors.Green; 
     AllColors other=(AllColors)color2; 
     // AllColors.Green 

     AllColors final=ParseColor(PrimaryColors.Yellow); 
     // AllColors.Yellow 
    } 
}