2012-04-24 41 views
11

Tôi biết cách lặp qua danh sách các thuộc tính enum, nhưng làm cách nào tôi lặp qua tất cả các thuộc tính enum "đã chọn"? Ví dụ: nếu một người đã làm Prop1 | Prop2 chống lại public enum Foo { Prop1; Prop2; Prop3 }, tôi sẽ đạt được điều này như thế nào?Lặp qua các giá trị "Đã chọn" Enum?

Đây là những gì tôi có bây giờ:

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

Nó vòng qua tất cả các thuộc tính enum, nhưng tôi muốn để lặp chỉ có những người đã được "chọn".

Cập nhật: [Flags] thuộc tính đã được đặt.

Cập nhật 2: Enum chứa một số lượng lớn thuộc tính, tôi không thể và sẽ không gõ/hardcode một kiểm tra thuộc tính duy nhất, thay vào đó tôi muốn tự động lặp qua từng thuộc tính và kiểm tra xem trường hợp enum của tôi có chứa Bar hay không bộ mục được lặp lại.

+0

Bạn có dính các FlagsAttribute trên enum? – scottheckel

+0

@ Hexxagonal: Không quan trọng. Tuy nhiên, chỉ định rõ ràng các giá trị quan trọng rất nhiều. –

+0

@Hexxagonal Đó thực sự là tùy chọn nhiều hơn bất cứ điều gì. Các enums có thể hoặc có thể không phải là mỗi quyền hạn của hai. Có hay không cờ đạt được. được thiết lập * nên * vấn đề, nhưng thực sự nó không. – Servy

Trả lời

23

Làm thế nào về những điều sau đây:

FileStatus status = FileStatus.New|FileStatus.Amazing; 

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

Hoặc trong một ngã swoop LINQ:

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

+1, tôi đồng ý, nó chỉ in nếu cờ được đặt. – Tejs

+0

Hoạt động tuyệt vời! 'if' chỉ truyền khi thuộc tính enum vòng lặp được đặt cho trạng thái! – Tower

3

Giả sử bạn có bộ này dưới dạng bitmap, sau đó chỉ cần "và" -ing các giá trị sẽ xác định được chọn.

SomeEnum bitmask = value; 

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

'bitmask.HasFlag (SomeEnum.Value1)' có thể đọc được nhiều hơn và làm điều tương tự –

+0

Điểm tốt! Tuy nhiên, nó là tốt đẹp để hiểu chính xác những gì đang làm dưới mui xe, vì lợi ích đầy đủ. – 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

Bạn sẽ cần phải đánh dấu enum với Flags thuộc tính. Để có được giá trị mà bạn có thể sử dụng phương pháp yourObject.EnumProperty.HasFlag, ví dụ:

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(); 
    } 
} 
Các vấn đề liên quan