Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET枚举中搜索正确的方法_C#_Linq_Enums - Fatal编程技术网

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

C# 如何在.NET枚举中搜索正确的方法,c#,linq,enums,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 "

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

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);
    }
}
公共类用户
{
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
公共用户权限权限{get;set;}
公共重写字符串ToString()
{
返回“用户名:”+用户名+“-密码:”+密码+“-权限:”+权限;
}
}
公共枚举用户权限
{
管理
SmallAdmin,
SimpleUser,
傻瓜
}
公共类枚举查找器
{
公共列表用户=新列表();
公共枚举查找器()
{
CreateUsers();
列表搜索=(从用户中的a开始,其中a.Permissions==UserRights.SimpleUser选择a).ToList();
foreach(搜索中的用户)
{
Console.WriteLine(user.ToString());
}
}
/// 
///创建一些示例用户并将对象放入用户列表中
/// 
私有void CreateUsers()
{
var user1=新用户();
user1.UserName=“user1”;
user1.Password=“password1”;
user1.Permissions=UserRights.Admin;
var user2=新用户();
user2.UserName=“user2”;
user2.Password=“password2”;
user2.Permissions=UserRights.SmallAdmin | UserRights.JustDummy;
var user3=新用户();
user3.UserName=“user3”;
user3.Password=“password3”;
user3.Permissions=UserRights.SimpleUser;
Users.Add(user1);
Users.Add(user2);
Users.Add(user3);
}
}
如您所见,我在用户列表中添加了一些示例用户。他们每个人都有不同的权限。现在让我们假设我想搜索每个拥有“Admin”权限的用户。 这可以正常工作(对于该用户):

List search=(从用户中的a.Permissions==UserRights.Admin选择a.ToList();
但是假设我正在寻找一个拥有SmallAdmin权限的用户。所以我试了一下:

    List<User> search = (from a in Users where a.Permissions == UserRights.SmallAdmin select a).ToList<User>();
List search=(从用户中的a.Permissions==UserRights.SmallAdmin选择a.ToList();
在这种情况下,找不到用户。为什么不呢?
感谢您的帮助。

使用
[Flags]
属性标记您的枚举,并改用方法

List<User> search = (from a in Users 
                     where a.Permissions.HasFlag(UserRights.SmallAdmin)
                     select a).ToList<User>();
列表搜索=(来自用户中的
其中a.Permissions.HasFlag(UserRights.SmallAdmin)
选择一个.ToList();

使用
[Flags]
属性标记枚举,并改用方法

List<User> search = (from a in Users 
                     where a.Permissions.HasFlag(UserRights.SmallAdmin)
                     select a).ToList<User>();
列表搜索=(来自用户中的
其中a.Permissions.HasFlag(UserRights.SmallAdmin)
选择一个.ToList();

您使用枚举作为标志,这可以从
UserRights.SmallAdmin | UserRights.JustDummy
中看到

执行此操作时,您必须为枚举使用
[Flags]
属性还必须确保对枚举值进行or运算确实会产生有意义的结果

如果将枚举更改为

[Flags]
public enum UserRights
{
    Admin = 1,
    SmallAdmin = 2,
    SimpleUser = 4,
    JustDummy = 8
}
那么您已经在
UserRights.SmallAdmin | UserRights.JustDummy
中完成了一半,它将等于
10
,这是该标志组合所特有的

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



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

您使用枚举作为标志,这可以从
UserRights.SmallAdmin | UserRights.JustDummy
中看到

执行此操作时,您必须为枚举使用
[Flags]
属性还必须确保对枚举值进行or运算确实会产生有意义的结果

如果将枚举更改为

[Flags]
public enum UserRights
{
    Admin = 1,
    SmallAdmin = 2,
    SimpleUser = 4,
    JustDummy = 8
}
那么您已经在
UserRights.SmallAdmin | UserRights.JustDummy
中完成了一半,它将等于
10
,这是该标志组合所特有的

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



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

当您使用
SmallAdminselect
权限添加用户时,是否确实设置了正确的枚举值…?我不太确定您的意思,但我更正了示例代码中的一点输入错误(缺少空格…)。你能给我一些更详细的信息吗?你确定你在添加具有
SmallAdminselect
权限的用户时设置了正确的枚举值吗…?我不确定你的意思,但我更正了示例代码中的一点输入错误(缺少空格…)。你能告诉我更多的细节吗?哦,酷,这可以自动完成吗?我一直认为我必须手动设置每个标志的值,就像在我的回答中一样。哇,这很好用。但是假设我想查找所有拥有“JustDummy”或“SmallAdmin”或“Admin”权限的用户。在我看来,这应该是这样的:列表搜索=(从用户中的a.Permissions.HasFlag(UserRights.JustDummy | UserRights.SmallAdmin | UserRights.Admin)选择a);但当时只找到了“User2”,而没有找到User1(具有管理员权限)。我尝试使用不同的运算符,但没有任何效果。有人有其他想法吗?@CodeCannibal这里有一个简单的方法:
where new[]{UserRights.JustDummy,UserRights.SmallAdmin,UserRights.Admin}.Any(x=>a.Permissions.hasvag(x))
对不起,我认为这不对。如果我尝试此“列表搜索=(从用户中的a中,其中new[]{UserRights.JustDummy,UserRights.Admin}.Any(x=>a.Permissions.HasFlag(x))选择a).ToList();”则将找到所有3个用户User3'只有SimpleUser权限,所以它不应该出现在结果中-但它是:)哦,酷,这可以自动完成吗?我一直认为我必须手动设置eac的值