2012-07-26 71 views
2

我正在嘗試生成標記的枚舉的反函數。下面是枚舉:使用LINQ標記的枚舉合併(反相組合)

[Flags] 
public enum MyType 
{ 
    Unknown = 0, 
    A = 1 << 0, 
    B = 1 << 2, 
    C = 1 << 3, 
    D = 1 << 4, 
    E = 1 << 5, 
    F = 1 << 6 
} 

我已經定義了一個靜態MyType mtGroup1(A | B)值。我想生成這個的倒數,不包括Unknown

我的解決辦法:

MyType t = MyType.Unknown; 
foreach (var vType in Enum.GetValues(typeof(MyType)).OfType<MyType>()) 
{ 
    if ((mtGroup1 & vType) != vType) 
     t = t | vType; //Consolidates into a single enum, excluding unknown 
} 

所得的t值是C | D | E | F,其是所期望的結果。 這種方法的工作原理,但我希望有一個更簡單的方法來整合,如上所示使用LINQ(其他非LINQ方法也可以接受,如果更簡單)。

謝謝!

回答

2

Unconstrained Melody項目使這很簡單:

MyType inverse = mtGroup1.UsedBitsInverse(); 

該項目包含了許多有用的方法(多寫爲擴展方法),它用「難以啓齒」通用的約束(這是由C#編譯器瞭解的人但不能用C#表示)將泛型類型參數約束爲枚舉類型或委託。通過這種方式,上面的代碼可以在沒有任何裝箱的情況下工作 - 它實際上只是一次枚舉枚舉類型的所有「有趣」位,這是第一次將該類型與Unconstrained Melody結合使用,所以此操作效率非常高。

如果不希望使用無約束的旋律,你可以寫你自己的方法來找到一個枚舉的「使用位」一次,然後只需使用:

MyType t = UsedBitsOfMyType & ~mtGroup1; 
+0

有趣! Skeet先生總是如此迅速 - 令我印象深刻。在接受你的答案之前,我會給大約一天時間讓其他人提交不是完整圖書館的答案。 – 2012-07-26 21:50:36

+0

檢查最後一部分:'如果你不想使用[圖書館] ...'。 – 2012-07-27 14:13:21