如何在.NET枚举中以正确的方式进行搜索

本文关键字:方式进 搜索 NET 枚举 | 更新日期: 2023-09-27 18:20:23

我想给我的"用户"对象一些权限。该权限是在枚举中定义的。为了更容易理解,我将发布我的代码。

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);
    }
}

因此,正如您所看到的,我在用户列表中添加了一些示例用户。他们每个人都有不同的权限。现在假设我想搜索每个拥有"管理员"权限的用户。这很好(对于那个用户):

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

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

如何在.NET枚举中以正确的方式进行搜索

[Flags]属性标记枚举,并使用HasFlag方法代替

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

您将枚举用作标志,如UserRights.SmallAdmin | UserRights.JustDummy中所示。

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

如果您将枚举更改为

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

那么你已经达到了一半,CCD_ 5将等于CCD_。

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


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