2012-03-15 165 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連接類型,讀者類型等)