我有2个枚举
enum Categories{
Entertainment=100,
Food=200,
Medical=300
};
enum Types
{
Multiplex = 101,
GameZone,
Bar = 201,
Hotel,
Cafe,
Hospital = 301,
Clinic
};
我想列出特定类别下的所有类型 例如。 如果我给娱乐作为输入输出列表将包含Multiplex和Gamezone
我该怎么做?
答案 0 :(得分:3)
首先,这看起来像一个非常糟糕的设计。你有隐含的关系,而不是明确的关系(即字典或类似的类型明确表示什么与什么相关)。
我会认真考虑找一种不同的方式来组织这些事情。
但是,尽管如此,这是获得类型的一种方法:
var cat = Categories.Entertainment;
var types =
from Types type in Enum.GetValues(typeof(Types))
where (int)type >= (int)cat && (int)type < (int)cat+100
select type;
答案 1 :(得分:3)
我建议你为你使用字典,如下所示:
Dictionary<Categories,List<Types>> dictionary = new Dictionary<Categories, List<Types>>()
{
{ Categories.Entertainment, new List<Types> { Types.Multiplex , Types.GameZone} },
{ Categories.Food, new List<Type> { Types.Bar, Types.Hotel, Types.Cafe }}
};
这样你可以检索相应的列表,给出正确的键,如下所示:
dictionary[Categories.Entertainment]
将返回包含元素的列表
Types.Multiplex
和Types.GameZone
。
答案 2 :(得分:2)
我建议使用将其指向类别的自定义属性来修饰类型枚举值。
我知道你已经放入了范围值,但我的偏好是自定义属性。
实施例
使用属性
public class CategoryAttribute : Attribute
{
private readonly Category _category;
public Category Category
{
get
{
return _category;
}
}
public CategoryAttribute(Category category)
{
_category = category;
}
}
您可以使用与
类似的方法public static Category GetCateogryFromType(Types categoryType)
{
var memberInfo = typeof(Types).GetMember(categoryType.ToString())
.FirstOrDefault();
if (memberInfo != null)
{
var attribute = (CategoryAttribute)memberInfo.GetCustomAttributes(typeof(CategoryAttribute), false).FirstOrDefault();
if (attribute != null)
{
return attribute.Category;
}
}
throw new ArgumentException("No category found");
}
public static IEnumerable<Types> GetCategoryTypes(Category category)
{
var values = Enum.GetValues(typeof(Types)).Cast<Types>();
return values.Where(t => GetCateogryFromType(t) == category);
}
然后装饰你的类型
public enum Types
{
[Category(Category.Entertainment)]
Multiplex,
[Category(Category.Entertainment)]
GameZone,
[Category(Category.Food)]
Bar,
[Category(Category.Food)]
Hotel,
[Category(Category.Food)]
Cafe,
[Category(Category.Medical)]
Hospital,
[Category(Category.Medical)]
Clinic
}
然后你可以打电话
GetCategoryTypes(Category.Entertainment).ToList();
哦,我将您的类别枚举重命名为Category :-p