2012-04-24 23 views
11

मुझे पता है कि गुणों की enum सूची के माध्यम से कैसे लूप करना है, लेकिन मैं सभी "चयनित" enum गुणों के माध्यम से कैसे लूप होगा? उदाहरण के लिए, यदि public enum Foo { Prop1; Prop2; Prop3 } के विरुद्ध Prop1 | Prop2 किया गया, तो मैं इसे कैसे प्राप्त करूं?"चयनित" एनम मूल्यों के माध्यम से लूप?

var values = Enum.GetValues(typeof(FileStatus)).Cast<FileStatus>(); 
foreach (var value in values) 
{ 
} 

यह सब enum गुण के माध्यम से लूप होता है, लेकिन मैं करने के लिए लूप केवल जो कि गया "चयनित" करना चाहते हैं:

यह वही है मैं अब है।

अद्यतन: [Flags] विशेषता सेट की गई थी।

अद्यतन 2: enum में बड़ी संख्या में गुण होते हैं, मैं एक एकल संपत्ति जांच/हार्डकोड नहीं कर सकता/सकती हूं, इसके बजाय मैं उनमें से प्रत्येक के माध्यम से गतिशील रूप से लूप करना चाहता हूं और जांच सकता हूं कि मेरा enum उदाहरण Bar शामिल है या नहीं लूप आइटम सेट।

+0

आप enum पर FlagsAttribute छड़ी किया? – scottheckel

+0

@Hexxagonal: कोई फर्क नहीं पड़ता। हालांकि, स्पष्ट रूप से मूल्यों को असाइन करना बहुत मायने रखता है। –

+0

@Hexxagonal यह वास्तव में किसी भी चीज़ से अधिक वैकल्पिक है। Enums दो की शक्ति हो सकता है या नहीं। झंडे को चाहे या नहीं। सेट * चाहिए * चाहिए, लेकिन वास्तव में यह नहीं है। – Servy

उत्तर

23

कैसे निम्नलिखित के बारे में:

var flags = Enum.GetValues(typeof(FileStatus)) 
       .Cast<FileStatus>() 
       .Where(s => status.HasFlag(s)); 
+0

+1, मैं सहमत हूं, यह केवल तभी प्रिंट करता है जब ध्वज सेट हो। – Tejs

+0

अद्भुत काम करता है! 'अगर' केवल तब गुजरता है जब लूपड एनम संपत्ति स्थिति के लिए निर्धारित होती है! – Tower

3

मान लें कि आपके पास यह सेट बिटमैस्क के रूप में है, तो बस "और"-मानों को निर्धारित करना होगा कि कौन से चुने गए हैं।

SomeEnum bitmask = value; 

if(bitmask & SomeEnum.Value1 > 0) 
    // SomeEnum.Value1 was set 
+3

'bitmask.HasFlag (SomeEnum.Value1) 'अधिक पठनीय है और वही बात –

+0

अच्छी बात है! फिर भी, यह समझना अच्छा लगता है कि हुड के तहत क्या कर रहा है, पूर्णता के लिए। – Tejs

1
FileStatus someValue = ...; 
var selectedValues = new List<FileStatus>(); 
var allValues = Enum.GetValues(typeof(FileStatus)).Cast<FileStatus>(); 
foreach (var value in allValues) 
{ 
    if(someValue & value != 0)//note bitwise AND, not logical AND. 
    { 
    selectedValues.Add(value); 
    //this value is selected. You can stick it in a List or do whatever with it. 
    } 
} 
0

आप Flags विशेषता के साथ enum चिह्नित करने के लिए की आवश्यकता होगी:

FileStatus status = FileStatus.New|FileStatus.Amazing; 

foreach (FileStatus x in Enum.GetValues(typeof(FileStatus))) 
{ 
    if (status.HasFlag(x)) Console.WriteLine("{0} set", x); 
} 

या एक में LINQ स्वूप गिर गया। मूल्यों आप yourObject.EnumProperty.HasFlag विधि का उपयोग कर सकते हैं पाने के लिए, उदाहरण के लिए:

class Program 
{ 
    [Flags] 
    public enum Bar { Prop1, Prop2, Prop3 } 

    public class Foo 
    { 
     public Bar SelectedBar { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     var foo = new Foo(); 
     foo.SelectedBar = Bar.Prop1 | Bar.Prop2; 

     foo.SelectedBar.HasFlag(Bar.Prop1); //true 
     foo.SelectedBar.HasFlag(Bar.Prop2); //true 
     foo.SelectedBar.HasFlag(Bar.Prop3); //false 
    } 
} 
3
[Flags] 
public enum Foo 
{ 
    Prop1 = 1, 
    Prop2 = 1 << 1, 
    Prop3 = 1 << 2 
} 

public static class FooExtensions 
{ 
    private static readonly Foo[] values = (Foo[])Enum.GetValues(typeof(Foo)); 

    public static IEnumerable<Foo> GetComponents(this Foo value) 
    { 
     return values.Where(v => (v & value) != 0); 
    } 
} 

public static class Program 
{ 
    public static void Main(string[] args) 
    { 
     var foo = Foo.Prop1 | Foo.Prop3; 

     var components = foo.GetComponents().ToArray(); 
    } 
} 
संबंधित मुद्दे