我有这样的事情硬编码:填充一个多维数组
private string[,] m_RolesForUser = new string[,] {
{"John","President,Chair"},
{"Lisa","Chair"},
{"Mike","Executive,President,Chair"},
};
我将如何填补这个数组,如果数据源是由角色的表和用户的表。用户可以有多个角色。不知道构造代码来支持这样的语法的语法是什么。
我有这样的事情硬编码:填充一个多维数组
private string[,] m_RolesForUser = new string[,] {
{"John","President,Chair"},
{"Lisa","Chair"},
{"Mike","Executive,President,Chair"},
};
我将如何填补这个数组,如果数据源是由角色的表和用户的表。用户可以有多个角色。不知道构造代码来支持这样的语法的语法是什么。
为什么不在这里使用对象列表的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));
}
}
谢谢。你能告诉我如何阅读或遍历字典寻找角色“丽莎”有? – obautista 2012-03-15 14:12:00
我刚刚创建了一个如何找到角色的示例片段。 – 2012-03-15 14:17:49
您有不同的数据结构选项。一个想法是对用户类和存储角色列表,为每个用户
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连接类型,读者类型等)
作为一般规则,如果你的语言是C#,多维数组通常是问题的一部分,而不是解决方案的一部分。可悲的是,他们的支持很不足。 – xanatos 2012-03-15 14:00:36
请不要用“C#”等来标题。这就是标签的用途。 – 2012-03-15 14:01:17
我会推荐使用一些自制的结构或一些其他复杂的数据结构,如列表或数组的字典。我更喜欢有完整的面向对象的观点,但那就是我的观点 – squelos 2012-03-15 14:03:00