2012-03-15 87 views
0

我有这样的事情硬编码:填充一个多维数组

private string[,] m_RolesForUser = new string[,] { 
    {"John","President,Chair"}, 
    {"Lisa","Chair"},  
    {"Mike","Executive,President,Chair"}, 
}; 

我将如何填补这个数组,如果数据源是由角色的表和用户的表。用户可以有多个角色。不知道构造代码来支持这样的语法的语法是什么。

+4

作为一般规则,如果你的语言是C#,多维数组通常是问题的一部分,而不是解决方案的一部分。可悲的是,他们的支持很不足。 – xanatos 2012-03-15 14:00:36

+0

请不要用“C#”等来标题。这就是标签的用途。 – 2012-03-15 14:01:17

+0

我会推荐使用一些自制的结构或一些其他复杂的数据结构,如列表或数组的字典。我更喜欢有完整的面向对象的观点,但那就是我的观点 – squelos 2012-03-15 14:03:00

回答

4

为什么不在这里使用对象列表的Dictionary? C#是OO语言,因此使用对象更受欢迎。下面的例子使用字符串,以适应你的榜样,但你甚至可以创建一个Person类和Role类,并有一个Person绑列表Role小号

private Dictionary<string, List<string>> roles = new Dictionary 
    { 
     {"John", new List{"President","Chair"}}, 
     {"Lisa", new List{"Chair"}},  
     {"Mike", new List{"Executive","President","Chair"}} 
    } 

为了寻找丽莎的角色:

//Just verifying that Lisa exists. 
//If you try to access a non-existent key you will get an exception 
var roleLookingFor = "Lisa"; 
if(roles.Contains(roleLookingFor)) 
{ 
    foreach(var role in roles[roleLookingFor]) 
    { 
     Console.Out.WriteLine(String.Format("{0} is in role '{1}'.", 
               roleLookingFor, role)); 
    } 
} 
+0

谢谢。你能告诉我如何阅读或遍历字典寻找角色“丽莎”有? – obautista 2012-03-15 14:12:00

+0

我刚刚创建了一个如何找到角色的示例片段。 – 2012-03-15 14:17:49

1

您有不同的数据结构选项。一个想法是对用户类和存储角色列表,为每个用户

public class User 
{ 
    public User() 
    { 
     Roles = new List<string>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 

    public List<string> Roles { get; private set; } 
} 

然后你就可以有一个用户列表

List<User> _users = new List<User>(); 

如果你想存储更多每个角色的信息,你可以有一个角色类以及每个角色的用户列表。与数组相比,List<T>的好处是列表动态增长。

填补这一结构是这样

using (OleDbConnection cnn = new OleDbConnection(ConnectionString)) { 
    string query = "SELECT ... FROM users LEFT JOIN user_roles ON ... ORDER BY UserID"; 
    using (OleDbCommand cmd = new OleDbCommand(query, cnn)) { 
     cnn.Open(); 
     using (OleDbDataReader reader = cmd.ExecuteReader()) { 
      int userIdOrdinal = reader.GetOrdinal("UserID"); 
      int userNameOrdinal = reader.GetOrdinal("UserName"); 
      int roleIdOrdinal = reader.GetOrdinal("RoleID"); 
      int roleNameOrdinal = reader.GetOrdinal("RoleName"); 
      User user = null; 
      while (reader.Read()) { 
       int userID = reader.GetInt32(userIdOrdinal); 
       if (user == null || user.ID != userID) { 
        user = new User { ID = userID }; 
        user.Name = reader.GetString(userNameOrdinal); 
        _users.Add(user); 
       } 
       if (!reader.IsDBNull(roleIdOrdinal)) { 
        user.Roles.Add(reader.GetString(roleNameOrdinal); 
       } 
      } 
     } 
    } 
} 

(原因你会使用approriate连接类型,读者类型等)