2011-10-25 13 views
6

की एक सूची में है अगर मैं निम्नलिखित enum है:सरल तुलना एक enum enums

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

अब मैं 3materials जिस पर मैं चल सका (लकड़ी पत्थर पृथ्वी) है और 3 जो चलने योग्य (पानी लावा हवा नहीं हैं)

यदि मैं ध्वज तीनों में से एक है तो तुलना करना संभव बनाना चाहता हूं।

फिलहाल, यह है कि कैसे मैं यह कर:

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] enum इस्तेमाल कर सकते हैं:

[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

पता था कि नहीं था यह सी # –

+0

में संभव हो गया था क्यों तुम सब enum मूल्यों के लिए संख्यात्मक मान के रूप में परिभाषित करते हैं 'सहज' जोड़-तोड़ में इस तरह कर सकता है? मुझे लगता है कि इसे 'कोई नहीं' (और 'चलने योग्य') के लिए सेट करना भी ठीक ही काम करेगा। – svick

+0

उन्हें थोड़ा झंडे बनाने के लिए आप यह सुनिश्चित करना चाहते हैं कि वे 2 की शक्तियां हैं। अन्यथा आपके मान 0 से शुरू होते हैं और 1 से बढ़ते हैं। – Dismissile

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

परावर्तन आप एक Enum के लिए सभी मूल्यों को प्राप्त करने के लिए, और फिर जाँच अगर यह मौजूद है की अनुमति देता है। हालांकि, मुझे यकीन नहीं है कि आप उस तर्क को हल कर सकते हैं जिसे आप करने का प्रयास कर रहे हैं।

यदि मैं आपकी "तर्क" समस्या को समझता हूं, तो आपको शायद इसे कक्षाओं में बदलना होगा, जिसमें यह संकेत होगा कि वे चलने योग्य हैं या नहीं। आप क्वेरी बनाने के लिए LINQ का उपयोग करने की अनुमति दे:

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

यह छद्म कोड है, लेकिन मुझे आशा है कि आप क्या मैं समझाने की कोशिश कर रहा हूँ मिलता है। एन्म्स का उपयोग करके आप केवल एक ही मूल्य प्राप्त कर सकते हैं, और आपको हमेशा कथन में हार्डकोड करना होगा कि क्या चल रहा है और क्या नहीं है।

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

शायद आपको एनम का उपयोग करने के बजाय विरासत के साथ कक्षा का उपयोग करना चाहिए। यह आपको सभी प्रकार की संपत्तियों को परिभाषित करने की अनुमति देगा।

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) 
संबंधित मुद्दे