2016-04-05 4 views
3

Предполагая, что у меня есть категория перечислимую с некоторыми значениями:C#, имеющие Перечисления из Перечисления

enum Category { 
ProgrammingBooks 
CookingBooks 
} 

и я хочу каждое перечисление, чтобы иметь свое собственное перечисление, например: ProgrammingBooks проведет:

enum ProgrammingBooks { 
CSharp, 
Java, 
Cpp 
} 

я увидел решение предлагает это:

enum Fauna { 
enum Type { MAMMAL, BIRD } 

TIGER(Type.MAMMAL), 
LION(Type.MAMMAL), 
PEACOCK(Type.BIRD), 
OWL(Type.BIRD); 

private final Type type; 

Fauna(Type type) { this.type = type; } 

} 

с использованием:

Stream.of(Fauna.values()).filter(f -> f.type == BIRD).toList() 

Однако я всего лишь новичок, и я ищу что-то, что, даже если я не знаю и не должен учиться, не стану хардкором на меня. Я не понимаю пример, который я упомянул (который я нашел в StackOverFlow).

+6

Выглядит больше как Java, чем C#. –

+14

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

+2

Для справки, https://stackoverflow.com/questions/20605628/iterating-enum-of-enums, похоже, откуда этот пример; и, как говорит @UweKeim, это Java. –

ответ

6

Использовать классы или интерфейсы. Например:

public enum Category 
{ 
    ProgrammingBooks, 
    CookingBooks 
} 

public interface IBook 
{ 
    Category BookType { get; set; } 
    string Title { get; set; } 
    string Author { get; set; } 
    // ... 
} 

public class ProgrammingBook: IBook 
{ 
    public ProgrammingBook() 
    { 
     this.BookType = Category.ProgrammingBooks; 
    } 
    public string Author { get; set; } 
    public string Title { get; set; } 
    public Category BookType { get; set; } 
    // ... 
} 

public class CookBook : IBook 
{ 
    public CookBook() 
    { 
     this.BookType = Category.CookingBooks; 
    } 
    public string Author { get; set; } 
    public string Title { get; set; } 
    public Category BookType { get; set; } 
    // ... 
} 

Если вы хотите поддержать «подвиды» Вы могли бы предоставить свойство, которые только принадлежат к определенному классу, а не в интерфейс, потому что не каждая книга о программировании. Например:

public enum ProgrammingLanguage 
{ 
    CSharp, 
    Java, 
    Cpp 
} 

public class ProgrammingBook: IBook 
{ 
    // a constructor that takes the ProgrammingLanguage as argument 
    public ProgrammingBook(ProgrammingLanguage language) 
    { 
     this.BookType = Category.ProgrammingBooks; 
     this.Language = language; 
    } 

    public ProgrammingLanguage Language { get; set; } 
    public string Author { get; set; } 
    public string Title { get; set; } 
    public Category BookType { get; set; } 
    // ... 
} 

Почему я вообще использую интерфейсы? Потому что у всех книг есть что-то общее (т. Е. У всех есть титул и автор). Таким образом, вы можете воспользоваться Polymorphism:

var library = new List<IBook>(); 
var book1 = new ProgrammingBook(ProgrammingLanguage.CSharp) {Title = "C# in Depth", Author = "Jon Skeet"}; 
var book2 = new CookBook() { Title = "Everyday Superfood", Author= "Jamie Oliver" }; 
library.Add(book1); 
library.Add(book2); 

// now you can loop all and you know that all books have these properties 
foreach (IBook book in library) 
{ 
    Console.WriteLine("Title: {0} Type: {1}", book.Title, book.BookType.ToString()); 
} 

или если вы хотите, чтобы получить программирования книги:

foreach (IBook book in library.Where(b => b.BookType == Category.ProgrammingBooks)) 
{ 
    // ... 
} 

же с Enumerable.OfType метода LINQ, который проверяет только тип:

foreach (IBook book in library.OfType<ProgrammingBook>()) 
{ 
    // .... 
} 
+0

Иисус Христос, я писал почти тот же код. Я думаю, это то, что он хочет. +1 –

+0

@LeandroSoares --- woooahhh, успокоиться ... –

+1

Спасибо Тим! Леандро, спасибо также за усилия. – N3wbie

0

Enum - это просто представление целого числа с текстом. Он не может содержать подкатегории или что-либо, кроме целого.

Вы должны создать класс для категорий и провести перечисление подкатегорий в каждом из них.

public class ProgrammingBook 
{ 
    public BookType Type{get;set;} 
} 

enum BookType { 
    CSharp, 
    Java, 
    Cpp 
} 
+0

Вы случайно отправили свой комментарий в качестве ответа? –

+1

звучит лучше, может быть пример? – N3wbie

+0

Я обновил свой ответ –

Смежные вопросы