将枚举标志(位组合)与linq进行比较

时间:2012-11-29 05:14:54

标签: c# linq enums flags

我有一个枚举声明

[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();

使用当前的枚举值,这似乎符合它的建议。但是,我非常有信心这段代码不正确,但我不确定我能解释为什么或如何实现正确的实现。

无论哪种方式,有人可以请他们确认这是否实际上是错误的(以及为什么)并提供如何实现我想要的结果的解释?

编辑:我可能不太清楚解释我的最高许可是什么。这是一个标志枚举。因此,它可以包含None,Create,Edit,View的任意组合。我期待找到的最高点基本上是Create + Edit + View。如果失败,请编辑+查看,最后查看

2 个答案:

答案 0 :(得分: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)

如果该顺序符合您的要求,那么您的代码是正确的。

答案 1 :(得分:0)

我不确定是否有从八进制到int的任何直接转换函数。

当我们传递Enumeration值时,您可以创建一个返回int值的函数。 例如,  GetIntValue(PermissionEnum.None) 这将返回0;

所以你可以按如下方式编写排序逻辑:

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