比较数组时填充列表的难度

时间:2011-01-26 12:35:53

标签: c# c#-4.0

在下面我想使用GetUsersRole但是显示的部分有困难。我想比较Roles值和usersRole,如果Role == usersRole,则UserRole = true,否则为false。

基本上我想像我这样的结果:

user1:true

用户2:假

用户3:错误

user4:true

取决于用户角色

班级角色

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

4 个答案:

答案 0 :(得分:1)

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

我不明白你想要做什么。但是根据你问题中显示的代码,我可以看到你是Calling Contains方法

userRole.Contains(item);

我假设您正在尝试在item数组中找到Roles但是在上下文中,您使用的参数userRole不是数组。要更正而不是:

private static UserRoleModel[] GetUsersRole(Role usersRole)

你应该写:

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

更新

好的我明白了..问题是在Contains methofd中你通过传递String来搜索,因为数组包含Type Role的值。

所以问题是如何从枚举实例的字符串表示中找到枚举实例数组中的枚举实例

通常你只能通过数组中的项类型进行搜索,但是这里有一个字符串表示法,所以可以这样做:

创建一个函数:

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

然后在你的代码中

UserRole = usersRole.Contains(GetRole(item));


更新

类型数组中没有包含方法

好吧我明白了..问题是包含方法,因为没有包含类型数组的方法而不是类型List<T>

对于数组,我们ExistsPredicate为参数进行搜索并返回bool

使用如下:

//just to be sure correct value is captured everytime
string copy = item;
//Predicate is in System.Predicate<T>
Predicate<string> predicate = itemtocheck => {   
       itemtocheck == copy;
   };
UserRole = Array.Exists(Enum.GetNames(typeof(Role)), predicate);

<小时/> 我的第一次更新是正确的,但后来我没有注意到数组没有方法包含。检查我的上次更新正确答案 希望它有所帮助

答案 1 :(得分:1)

您遇到此问题,因为当您实际上不需要字符串时,您将Role值转换为字符串。将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();
}

答案 2 :(得分:0)

在这个和你之前的问题之间,我想我可以弄清楚你想要做什么。

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

接下来,要动态获取Roles的名称,您需要使用更像[Enum.GetNames(enum)]的内容。如果你想要一个更好的描述而不是enum中的值的名称,你可以很容易谷歌搜索GetDescription函数,然后为每个函数应用[Description(...)]属性。

您还需要编写enum.HasFlag(MyEnum.ValueToCheckAgainst)扩展功能(or use the one built in .NET 4.0)以确定是否选中了复选框。

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

最后一部分,将这些复选框恢复为Role值,您必须手动执行此操作。编写一个函数,它将一个Role值数组和AND它们全部放在一起(在你使它成为合法的标志枚举之后)。然后返回结果。如果你想要比这更“优雅”的东西,你可能只想让这个函数成为你认为应该输出这些值的扩展(如你的视图模型)。

答案 3 :(得分:0)

*UserRole = usersRole.Contains(item)* ////difficulty here

将其更改为:

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