2011-10-25 66 views
6

的名单我有以下枚举:简单的比较,如果枚举是枚举

public enum Materials { Wood, Stone, Earth, Water, Lava, Air } 

现在我有,我可以走3materials(木石土)和3的arent可行走(水熔岩空气)

我想就可以比较,如果标志是三选一。

目前,这是我要做的事:

Materials myMat = Materials.Earth; 
if (myMat == Materials.Earth || myMat == Materials.Wood || myMat == Materials.Stone) 
{ 
    I can walk on myMat... 
} 

心不是有可能创造一个新的标志像Materials.Walkable其中包括这三种材料,所以我可以只使用

if (myMat == Materials.Walkable) 

如果这是可能的,我该怎么办呢?

在此先感谢;)

回答

12

您可以创建一个扩展方法:

public static bool IsWalkable(this Materials myMat) 
{ 
    return myMat == Materials.Earth || myMat == Materials.Wood || myMat == Materials.Stone; 

    // alternatively: 
    return new[] { Materials.Earth, Materials.Wood, Materials.Stone }.Contains(myMat); 
} 

而且使用它作为:

Materials myMat = ... 
bool isMyMatWalkable = myMat.IsWalkable(); 

如果你愿意,你也可以使用一个[Flags]枚举:

[Flags] 
public enum Materials 
{ 
    None = 0, 
    Wood = 1, 
    Stone = 1 << 1, 
    Earth = 1 << 2, 
    Water = 1 << 3, 
    Lava = 1 << 4, 
    Air = 1 << 5, 
    Walkable = Wood | Earth | Stone 
} 

而且那么你可以这样做:

Materials myMat = .. 
bool isMyMatWalkable = (myMat & Materials.Walkable) != Materials.None; 
+1

不知道这是在C# –

+0

可能你为什么要定义所有枚举值的数值直观的“操作这样的?我认为只为'None'(和“Walkable”)设置它也会起作用。 – svick

+0

为了使他们位标志,你想确保他们是2的幂。否则你的值从0开始,并增加1. – Dismissile

1
System.Enum.GetValues(typeof(Materials)).Contains(myValue) 

思考可以让你把所有的值枚举,然后检查它是否存在。 虽然,我不确定你可以解决你想要做的逻辑。

如果我理解你的“逻辑”的问题,你可能不得不把它变成类,也有一个标志信号无论他们是步行的。让您使用LINQ进行查询:

var walkableAreas = AllAreas.Where(area => area.walkable); 
if(walkableAreas.Contains(myArea) { //dostruff // } 

这是伪代码,但我希望你明白我试图解释。 使用枚举你只能有一个值,你总能在if语句什么是适合步行,什么硬编码不是。

1

您可以尝试创建自定义属性标记您的材料

public enum Materials 
{ 
    [Walkable(true)] 
    Wood, 
    [Walkable(true)] 
    Stone, 
    [Walkable(true)] 
    Earth, 
    [Walkable(false)] 
    Water, 
    [Walkable(false)] 
    Lava, 
    [Walkable(false)] 
    Air 
} 

public class WalkableAttribute : Attribute 
{ 
    public WalkableAttribute(bool value) 
    { 
     IsWalkable = value; 
    } 

    public bool IsWalkable { get; private set; } 
} 

然后使用扩展来检查它是否适合步行

public static class MaterialsExtemsion 
{ 
    public static bool IsWalkable(this Materials material) 
    { 
     var attribute = material.GetType().GetMember(material.ToString()).First().GetCustomAttributes(typeof(WalkableAttribute), false).FirstOrDefault(); 
     return attribute != null && ((WalkableAttribute) attribute).IsWalkable; 
    } 
} 

然后用它

 Materials material1 = Materials.Stone; 
     bool result = material1.IsWalkable(); // return true 

     Materials material2 = Materials.Air; 
     bool result = material2.IsWalkable(); // return false 
1

也许你应该使用带继承的类,而不是仅仅使用Enum。这将允许您定义各种属性。

public abstract class Material 
{ 
    public abstract bool Walkable(); 
} 


public class Wood : Material 
{ 
    public bool Walkable() 
    { 
     return true; 
    } 
} 

public class Lava: Material 
{ 
    public bool Walkable() 
    { 
     return false; 
    } 
} 
0

你会考虑用实体替换枚举吗?

public class Material 
{ 
    public string Name {get; set;} 
    public bool IsWalkable {get; set;} 
} 

那么你可以做的

Materials.Where(m => m.IsWalkable)