如何在.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>();
在这种情况下,找不到用户。为什么不呢?谢谢你的帮助。
用[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的更好,但这表明它是如何在内部处理的。