2012-04-24 5 views
11

プロパティの列挙型リストをループする方法はわかっていますが、すべての「選択済み」列挙型プロパティをどのようにループしますか?たとえば、Prop1 | Prop2に対してpublic enum Foo { Prop1; Prop2; Prop3 }に対して行った場合、どうすればよいでしょうか?「選択された」Enum値をループしますか?

これは私が今持っているものです。

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

これは、すべての列挙型のプロパティをループし、私はループ「選択」されたものだけをしたいと思います。

更新:[Flags]属性が設定されました。

更新2:enumには多数のプロパティが含まれていますが、1つのプロパティチェックをタイプ/ハードコードすることはできません。代わりに、それぞれを動的にループし、enumインスタンスBarループされた項目セット

+0

あなたは列挙型にFlagsAttributeを貼りましたか? – scottheckel

+0

@Hexxagonal:問題ではありません。しかし、明示的に値を割り当てることは大変重要です。 –

+0

@Hexxagonalこれは本当に何よりもオプションです。列挙型はそれぞれ2の累乗である場合とそうでない場合があります。フラグがattであるかどうか。本当にそれは重要ではありません。 – Servy

答えて

23

FileStatus status = FileStatus.New|FileStatus.Amazing; 

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

または1でLINQの急襲を落ちた:

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

+1、フラグが設定されている場合のみ印刷します。 – Tejs

+0

素晴らしい作品です! 'if'は、ループされたenumプロパティが状態のために設定されているときだけ渡されます! – 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属性を持つ列挙型をマークする必要があります。たとえば、あなたが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(); 
    } 
} 
関連する問題