如何在.NET枚举中搜索正确的方法

时间:2014-09-02 09:48:23

标签: c# linq enums

我想给我的"用户" - 对象一些权限。该权限在枚举中定义。 为了便于理解,我发布了我的代码。

public  class User
{
   public string UserName { get; set; }
   public string Password { get; set; }
   public UserRights Permissions { get; set; }

   public override string ToString()
   {
       return "Username: " + UserName + " - Password: " + Password + " - Permisssions: " + Permissions;
   }
}

public enum UserRights
{
    Admin,
    SmallAdmin,
    SimpleUser,
    JustDummy
}

public class EnumFinder
{
    public List<User> Users = new List<User>();

    public EnumFinder()
    {
        CreateUsers();

        List<User> search = (from a in Users where a.Permissions == UserRights.SimpleUser select a).ToList<User>();
        foreach (User user in search)
        {
            Console.WriteLine(user.ToString());
        }
    }

    /// <summary>
    ///     Create some example users and put the objects into User's list
    /// </summary>
    private void CreateUsers()
    {
        var user1 = new User();
        user1.UserName = "user1";
        user1.Password = "password1";
        user1.Permissions = UserRights.Admin;

        var user2 = new User();
        user2.UserName = "user2";
        user2.Password = "password2";
        user2.Permissions = UserRights.SmallAdmin | UserRights.JustDummy;

        var user3 = new User();
        user3.UserName = "user3";
        user3.Password = "password3";
        user3.Permissions = UserRights.SimpleUser;
        Users.Add(user1);
        Users.Add(user2);
        Users.Add(user3);
    }
}

因此,正如您所看到的,我将一些示例用户添加到了我的用户列表中。他们每个人都有不同的权限。现在让我们说我想搜索每个用户和#34; Admin&#34;允许。 这工作正常(对于那个用户):

List<User> search = (from a in Users where a.Permissions == UserRights.Admin select a).ToList<User>();

但是我想说我正在寻找具有SmallAdmin权限的用户。所以我尝试了这个:

    List<User> search = (from a in Users where a.Permissions == UserRights.SmallAdmin select a).ToList<User>();

在这种情况下,找不到用户。为什么不? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

使用[Flags]属性标记您的枚举,然后使用HasFlag方法

List<User> search = (from a in Users 
                     where a.Permissions.HasFlag(UserRights.SmallAdmin)
                     select a).ToList<User>();

答案 1 :(得分:1)

您可以将您的枚举用作标记,如UserRights.SmallAdmin | UserRights.JustDummy所示。

执行此操作时,您必须使用枚举[Flags]属性,同时确保枚举值或“枚举”值实际产生有意义的结果。

如果您将枚举更改为

[Flags]
public enum UserRights
{
    Admin = 1,
    SmallAdmin = 2,
    SimpleUser = 4,
    JustDummy = 8
}

那么你已经在UserRights.SmallAdmin | UserRights.JustDummy的中途将等于10,这对于那些旗帜组合是唯一的。

为了测试它,你必须使用二进制文件,例如:(value & UserRights.SmallAdmin) == UserRights.SmallAdmin将返回是否设置了这个特定的标志。


实际上@ Selman22更好,但这表明它是如何在内部处理的。