2012-03-15 14 views
0

を入力します。は私がハードコーディングされたこのようなものを持っている多次元配列

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

データソースが役割のテーブルとユーザーのテーブルの構成されていた場合はどのように私はこの配列を埋めるだろう。ユーザーは複数の役割を持つことができます。このようなものをサポートするためのコードを構築する構文が何であるかは不明です。

+4

、お使いの言語がある場合のC#、多次元アレイはソリューションの一部よりも多くの場合問題の一部です。残念ながら、彼らのサポートはかなり不足しています。 – xanatos

+0

タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

+0

私はいくつかの自家製の構造やリストや配列の辞書などの他の複雑なデータ構造を使用することをお勧めします。私は完全なオブジェクト指向のビューを持つことを好むが、それだけで私の意見は – squelos

答えて

4

ここにオブジェクトリストのDictionaryを使用しないのはなぜですか? C#はオブジェクト指向言語なので、オブジェクトを使う方がはるかに好ましい。以下の例では、あなたの例に合わせて文字列を使用してですが、あなたもPersonクラスとRoleクラスを作成し、リサの役割を探すためにRole

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

のリストに結び付けPersonを持つことができます:

//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

+0

私はちょうどあなたが役割を見つけるかもしれない方法のサンプルスニペットを作成しました。 –

1

データ構造にはさまざまなオプションがあります。一つのアイデアは、あなたがより多くを保存したい場合、あなたは、ユーザー

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

のリストを持つことができ、ユーザーのためのクラスを持っているし、各ユーザー

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<T>の利点は、リストが動的に成長することです。

フィル(あなたがapproriate接続タイプを使用することになり、原因のうち、リーダータイプなど)この

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

のように、この構造の一般的なルールとして

関連する問題