C# 比较数组时填写列表的困难

C# 比较数组时填写列表的困难,c#,c#-4.0,C#,C# 4.0,在下文中,我想使用GetUsersRole,但对所示的部分有困难。我想将Roles值与usersRole进行比较,如果Role==usersRole,那么UserRole=true,否则为false 基本上,我想要这样的结果: 用户1:对 用户2:错误 用户3:错误 用户4:对 取决于usersRole 阶级角色 public enum Role { User1 = 1, User2= 2,

在下文中,我想使用GetUsersRole,但对所示的部分有困难。我想将Roles值与usersRole进行比较,如果Role==usersRole,那么UserRole=true,否则为false

基本上,我想要这样的结果:

用户1:对

用户2:错误

用户3:错误

用户4:对

取决于usersRole

阶级角色

public enum Role
{                                            
    User1 = 1,
    User2= 2,
    User3= 3, 
    User4= 4
}
我正在上课

private class UserRoleModel
{
    public string Role { get; set; }
    public bool UserRole { get; set; }
}
和一种方法

public Role[] UserRoles { get; set; }  
private static UserRoleModel[] GetUsersRole(Role[]usersRole)
{
    List<UserRoleModel> rolesList = new List<UserRoleModel>();
    string[] Roles;
    Roles = new string[] { Role.user1.ToString(), Role.User2.ToString(), 
              Role.user3.ToString(), Role.user4.ToString() };
    foreach (var item in Roles)
    {
        rolesList.Add(new UserRoleModel
        {
            Role = item,
            *UserRole = usersRole.Contains(item)* ////difficulty here
        });
    }
    return rolesList.ToArray();
}
public Role[]UserRoles{get;set;}
私有静态UserRoleModel[]GetUsersRole(角色[]usersRole)
{
列表角色列表=新列表();
字符串[]角色;
Roles=新字符串[]{Role.user1.ToString(),Role.User2.ToString(),
Role.user3.ToString(),Role.user4.ToString()};
foreach(角色中的变量项)
{
添加(新用户角色模型)
{
角色=项目,
*UserRole=usersRole.Contains(item)*///此处的难度
});
}
返回rolesList.ToArray();
}

检查上次更新以获得正确答案

我不明白你想做什么。但是从您问题中显示的代码中,我可以看到您正在调用Contains方法

userRole.Contains(item);
我假设您试图在
角色的数组中查找
,但在上下文中,您使用的参数
userRole
不是数组。要更正而不是:

private static UserRoleModel[] GetUsersRole(Role usersRole)
你应该写:

private static UserRoleModel[] GetUsersRole(Role[] usersRole)

更新 好的,我明白了。。问题在于,在Contains Method中,您通过传递
字符串进行搜索,其中数组包含Role类型的值

所以问题是如何从Enum实例的字符串表示形式中在Enum实例数组中找到Enum实例

通常只能按数组中项目的类型进行搜索,但这里有一个字符串表示形式,因此可以执行以下操作:

创建一个函数:

public Role GetRole(string rolestring)
{
     Role result; 
     foreach(string rolename in Enum.GetNames(typeof(Role)))
     {
       if(rolename == rolestring)
       {
           try 
           {
             result = (Role) Enum.Parse(typeof(Role), rolename); 
           }
           catch(ArgumentException e)
           {
                 //Most unlikely we ever enter this catch s we know for sure we have role
                 //Process if role not found
                 throw;
           }
       }
     }
     return result;
}
然后在代码中


我的第一次更新是正确的,但我并没有注意到数组并没有包含方法。检查我上次更新的正确答案
希望能对你有所帮助

在这个问题和你之前的问题之间,我想我能找出你想要做什么

首先,如果您的用户可以担任多个角色,您将希望您的角色枚举使用该属性进行修饰。我假设这是您想要的,因为您使用的是复选框,而不是无线电选择器

接下来,要动态获取
角色的名称
,您需要使用类似的名称。如果您希望使用比枚举中的值名称更好的描述,可以非常轻松地在google上搜索函数,然后对每个函数应用
[description(…)]
属性

您还需要编写一个
enum.HasFlag(MyEnum.ValueToCheckAgainst)
扩展函数()来确定复选框是否被选中

另外,@Shekhar_Pro的答案也很有用,因为您希望函数只扮演一个角色,而不是一组角色来生成
UserRoleModel
s列表。然后,您将为要显示的每个用户调用此函数

最后一部分,将这些复选框转换回
角色
值,您必须手动执行此操作。编写一个函数,该函数接受一个
Role
值数组,并将它们全部合并在一起(在将其设置为合法标志枚举之后)。然后返回结果。如果您想要更“优雅”的东西,您可能只想将该函数作为您认为应该输出这些值的任何函数(如视图模型)的扩展

将此更改为:

UserRole = false;
foreach(Role r in usersRole)
{
    if(r == item)
    {
        UserRole = true;
        break;
    }
}

您遇到这个问题是因为您正在将
角色
值转换为字符串,而实际上并不需要字符串。将
ToString()
移动到实际需要的位置:

public Role[] UserRoles { get; set; }  
private static UserRoleModel[] GetUsersRole(Role[]usersRole)
{
    List<UserRoleModel> rolesList = new List<UserRoleModel>();

    Role[] roles = (Role[]) Enum.GetValues(typeof(Role));

    // or if you need the specific three values like in your example:
    // Role[] roles = new Role[] { Role.User1, Role.User2, Role.User3, Role.User4 };

    foreach (var role in roles)
    {
        rolesList.Add(new UserRoleModel
        {
            Role = role.ToString(),
            UserRole = usersRole.Contains(role)
        });
    }
    return rolesList.ToArray();
}
public Role[]UserRoles{get;set;}
私有静态UserRoleModel[]GetUsersRole(角色[]usersRole)
{
列表角色列表=新列表();
Role[]角色=(Role[])Enum.GetValues(typeof(Role));
//或者,如果您需要特定的三个值,如示例中所示:
//Role[]roles=新角色[]{Role.User1,Role.User2,Role.User3,Role.User4};
foreach(角色中的var角色)
{
添加(新用户角色模型)
{
Role=Role.ToString(),
UserRole=usersRole.Contains(角色)
});
}
返回rolesList.ToArray();
}

对不起,这个代码对我来说毫无意义。什么是
Role
,如
Role.user1.ToString()
,它来自哪里?这个代码的实际目的是什么,它看起来太复杂了,这通常向我表明我做了一个错误的转弯。嗨,我可以知道你指定的代码有什么问题吗?它没有成功编译吗?此外,代码也不太合理,特别是Role.user1.toString()的部分,请提供可接受的userRoles集(可能作为枚举或其他形式)。谢谢我错过了这一部分,我有一个类角色,正如abvecan解释的那样,我知道你会遇到异常…我没有异常,相反,我不知道如何进行比较,并且错误消息如下:错误1 API.Role[]'不包含'Contains'和最佳扩展方法重载'System.Linq.ParallelEnumerable.Contains(System.Linq.ParallelQuery,TSource)'的定义有一些无效的参数。我已对其进行了修改,实际上我正在将数组作为参数传递噢!!在我给你正确答案之前,你就接受了我的答案。。请查看我的上一次更新以获得正确的解决方案。我没有删除我以前的更新,让人们看到我以前犯了什么错误。。。
*UserRole = usersRole.Contains(item)* ////difficulty here
UserRole = false;
foreach(Role r in usersRole)
{
    if(r == item)
    {
        UserRole = true;
        break;
    }
}
public Role[] UserRoles { get; set; }  
private static UserRoleModel[] GetUsersRole(Role[]usersRole)
{
    List<UserRoleModel> rolesList = new List<UserRoleModel>();

    Role[] roles = (Role[]) Enum.GetValues(typeof(Role));

    // or if you need the specific three values like in your example:
    // Role[] roles = new Role[] { Role.User1, Role.User2, Role.User3, Role.User4 };

    foreach (var role in roles)
    {
        rolesList.Add(new UserRoleModel
        {
            Role = role.ToString(),
            UserRole = usersRole.Contains(role)
        });
    }
    return rolesList.ToArray();
}