2011-02-10 14 views
0

はちょうど私のバッグO」トリックを拡大しようと、いじり:私はちょうど実験と外と別の内部辞書と辞書オブジェクトのような何かをしたいた辞書の.Valueのネストされた辞書オブジェクトですか?

var dictionary = new Dictionary<ObjectType, Dictionary<string, string>>(); 

をするObjectTypeが列挙型であります

そういうわけで...あなたはこれをやろうとしているのではないのですか、私が住んでいる場所を突き止めようとしているときに、データをそこから検索します。

目的は役に立ちます:私はObjectGUIDを渡されており、データベーステーブルを束ねてオブジェクトが存在するテーブルを判断する必要があります。私がすでに書いた方法は、各テーブルをクエリしてカウントを返しますカップルの例は

  // Domain Check 
     sql = string.Format(@"select count(domainguid) from domains where domainguid = ?ObjectGUID"); 
     count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>(); 
     if (count > 0) 
      return ObjectType.Domain; 

     // Group Check 
     sql = string.Format(@"select count(domaingroupguid) from domaingroups where domaingroupguid = ?ObjectGUID"); 
     count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>(); 
     if (count > 0) 
      return ObjectType.Group; 

だから、それはすべて完了だと正常に動作します...しかし、フィールド名とテーブル名は、それぞれの変更だけの事をしているので、私は、私は再使用することができます場所について考え始めたチェック)です反復コード、私はディクショナリとforeachループを作成し、SQLの行を変更します(下記参照)。しかし、以下に示すように、各テーブル/フィールド名のペアのキーの種類としてObjectTypeが必要です私は後退できるnは私のオリジナルメソッドが正常に動作しますので、それはそれ以上の計算

Dictionary<string, string> objects = new Dictionary<string,string>(); 
      objects.Add("domains", "domainguid"); 
      objects.Add("domaingroups", "domaingroupguid"); 
      objects.Add("users", "userguid"); 
      objects.Add("channels", "channelguid"); 
      objects.Add("categorylists", "categorylistguid"); 
      objects.Add("inboundschemas", "inboundschemaguid"); 
      objects.Add("catalogs", "catalogguid"); 

      foreach (var item in objects) 
      { 
       sql = string.Format(@"select count({0}) from {1} where {0} = ?ObjectGUID", item.Value, item.Key); 
       count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>(); 
       if (count > 0) 
return ????? 
       } 

なしこれはすべてのことは重要ではありませんが、私は私は...あなたはオタクを検索するには、いくつかの新しい巧妙なアイデアを私になるかもしれないのStackOverflowと思いました誰かを推測することは頭の中で私を叩くと、配列を使用するように教えてくれる... :)

EDIT @ Jon Skeet --------------------- ---------------------

ええ、甘い、私はそれを行う正しい方法に来たかもしれないと思う...まだそれを実行していないあなたのために書いた例がここにあります

var objectTypes = new Dictionary<string, string>(); 
     objectTypes.Add("domainguid", "domains"); 
     var dictionary = new Dictionary<ObjectType, Dictionary<string, string>>(); 
     dictionary.Add(ObjectType.Domain, objectTypes); 

     foreach(var objectType in dictionary) 
     { 
      foreach(var item in objectType.Value) 
      { 
       sql = string.Format(@"select count({0}) from {1} where {0} = ?ObjectGUID", item.Key, item.Value); 
       count = (int)MySQLHelper.ExecuteScalar(ConnectionStrings.ConnectionStrings.V4DB_READ, sql, pObjectGUID).ToString().Parse<int>(); 
       if (count > 0) 
        return objectType.Key; 
      } 
     } 

このチャンクはdomainguidを検索するドメインテーブルに当たって、count> 0がObjectType.Domainを返します。問題はわずかながら巧妙に見えるかもしれませんが、2つの辞書オブジェクト、2つの文字列、いくつかのネストされたループ、最初のバージョンよりも読み込みとデバッグが難しく、チェックごとに10行ほど多くなります...これはあなたにのように見える場合は、その後、私は


もあなたが現在不足しているが、このhow to fetch data from nested Dictionary in c#

+0

あなたが正確に求めていることはあまり明確ではありません。 –

答えて

4

あなたは、それを確実に行うことができた:)それは私が私の脳に追加できるもう一つのことだと思います閉じ括弧とかっこそれは次のようになります。

var dictionary = new Dictionary<ObjectType, Dictionary<string, string>>(). 

あなたはおそらく何かしたい任意の値を追加するには、次のことが解決しない場合は、あなたがしようとしたとして失敗したコードを示してください

private void AddEntry(ObjectType type, string key, string value) 
{ 
    Dictionary<string, string> tmp; 
    // Assume "dictionary" is the field 
    if (!dictionary.TryGetValue(type, out tmp)) 
    { 
     tmp = new Dictionary<string, string>(); 
     dictionary[type] = tmp; 
    } 
    tmp.Add(key, value); 
} 

を - ネストされた辞書を使用しようとしないので、あなたの質問のデータベースコードは、私が知る限り、実際には関係ありません。

+0

これはちょうどタイプミスです私はそれを修正します –

+0

は、私の元の方法を検討すると効率的なすべてをチェックし、余分なオブジェクトの作成なしでコードの3行だけであることを楽しんで、例を投稿しました –

+0

@Jベンジャミン:あなたのサンプルでは、あなたはLINQが役に立つと思うかもしれないと思っています... –

関連する問題