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