2012-11-29 28 views
0

我有一個枚舉宣佈爲比較枚舉標誌(位組合)與LINQ

[Flags] 
public enum PermissionEnum 
{ 
    [EnumStringValue("None")] 
    None = 0x0, 
    [EnumStringValue("Create")] 
    Create = 0x1, 
    [EnumStringValue("Edit")] 
    Edit = 0x2, 
    [EnumStringValue("View")] 
    View = 0x4 
} 

隨後,我有一些LINQ試圖獲得可用的最高權限。

List<SecurityRolePermissionView> AvailablePermissions = GetPermissions(); 

SecurityRolePermissionView HighestPermission = AvailablePermissions.OrderByDescending(o => o.Permission).FirstOrDefault(); 

隨着目前的枚舉值,這似乎做它建議它會做。不過,我相當確信這段代碼是不正確的,但我不確定我能解釋爲什麼或如何實現正確的實現。

無論哪種方式,有人可以請客氣一點,以確認這事實上是不正確的(以及爲什麼),並提供解釋如何實現我想要的結果?

編輯:我可能沒有足夠清楚解釋我的最高權限是什麼。這是一個標誌枚舉。因此它可以包含無,創建,編輯,視圖的任意組合。我期望找到的最高級別是Create + Edit + View。如果失敗,編輯+查看和最後查看

+0

「擁有最高權限」是什麼意思?視圖比編輯更大,因爲這是你的樣本會給你的。 –

+0

公平點,但這是一個有點組合,我從來沒有視圖與編輯 - 它總是視圖+編輯或視圖+創建,我猜這就是爲什麼它的工作? –

+0

如果'AvailablePermissions'有兩個元素和一個帶有Edit的元素,另一個帶有View,那麼應該返回什麼?具有查看或編輯功能的'SecurityRolePermissionView' –

回答

4

枚舉排序是相同的枚舉的基礎類型的排序(C#指定部分7.9.5,「枚舉運營商」)。因此,這是您可能枚舉值的順序:

View | Edit | Create (= 7) 
View | Edit   (= 6) 
View | Create  (= 5) 
View     (= 4) 
Edit | Create  (= 3) 
Edit     (= 2) 
Create    (= 1) 
None     (= 0) 

如果該順序符合您的要求,那麼您的代碼是正確的。

+0

BAM!這完全解釋了它,真的幫助我有一個尤里卡時刻。直到現在,我還不確定我在IDE中看到的數字是什麼在下面表示 - 不知道爲什麼......無論如何,非常感謝你...... –

0

我不確定是否有任何可用的八進制到int的直接轉換功能。

您可以創建一個函數,當我們傳遞枚舉值時返回int值。 例如, GetIntValue(PermissionEnum.None) 這將返回0;

因此可以如下寫出的排序邏輯:

SecurityRolePermissionView HighestPermission = AvailablePermissions.OrderByDescending(o => GetIntValue(o.Permission)).FirstOrDefault();