2011-10-25 65 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)