2010-08-13 3 views
5

J'ai un dictionnaire (voir ci-dessous) qui a des chaînes de clé et chaînes de valeur et je veux pouvoir joindre ce dictionnaire à mon datatable en utilisant la clé du dictionnaire (Le champ unique équivilant dans le Datatable est appelé Network_ID). Comment puis-je faire ceci? J'espère un nouveau datatable qui a l'information datatable originale aussi bien que deux colonnes additionnelles de la donnée (clé et valeur du dictionnaire). Merci beaucoup.Joindre un dictionnaire à une base de données

Mon dictionnaire est de ce type: Dictionary<string, string> input = new Dictionary<string, string>();

Modifié:

  dt.Columns.Add("Key"); 
     dt.Columns.Add("KeyValue"); 

     foreach (System.Data.DataRow row in dt.Rows) 
     { 
      var networkID = (string)row["Network_ID"]; 

      if(input.ContainsKey(networkID)) 
      { 
       row["Key"] = networkID.ToString(); 
       row["KeyValue"] = input.Values.ToString(); 
      } 

     } 

Répondre

1

Vous pouvez accomplir cela en ajoutant deux colonnes à votre table de données, et en faisant défiler les lignes à remplir. Étant donné que les accès aux dictionnaires sont amortis O (1), la jointure totale a des performances linéaires car les accès aux dictionnaires sont amortis O (1).

+0

Salut kbrimington J'ai pris vos suggestions et fait quelques changements, mais après les modifications sont apportées à mon datatable et j'essaie d'imprimer chaque colonne et rangée dans un fichier texte mes autres colonnes de données sortent bien mais les nouvelles colonnes n'affichent pas les données lisibles. Exactement ce que vous voyez ci-dessous System.Collections.Generic.Dictionary'2 + ValueCollection [System.String, System.String] – Josh

+0

nevermind, je pense que je l'ai maintenant. Merci – Josh

0

Pour autant que je sache, en supposant que vous utilisez la classe DataTable, vous ne pouvez pas joindre un dictionnaire dans votre objet.

Vous pouvez créer une nouvelle DataTable (dans un DataSet) et transférer le contenu du dictionnaire dans la nouvelle table, vous pourriez ajouter de nouvelles colonnes à DataTable ou vous pouvez, si elle serait par applicable à votre situation, utilisez un Requête LINQ et une jointure dans la requête LINQ pour créer un type anonyme (ou vous pouvez créer un nouveau type qui représente les données combinées) et combiner et utiliser les données de cette façon.

Vous devriez noter que rien de tout cela ne pourra revenir à la base de données si vous avez besoin que cette information soit conservée. Tout cela serait transitoire dans votre application.

2

C'est assez facile (avec LINQ), même si le résultat ne sera pas un DataTable mais un IEnumerable d'une nouvelle classe anonyme.

 var result = from myDataRow in myDataTable.AsEnumerable() 
        join myKeyValuePair in myDictionary 
        on myDataRow.Field("Network_ID") equals myKeyValuePair.Key 
        select new { 
         NetworkID = myDataRow.Field("Network_ID"), 
         ... /* other DataTable row values here */, 
         DictionaryKey = myKeyValuePair.Key, 
         DictionaryValue = myKeyValuePair.Value 
        }; 

J'espère que vous devriez aller :) Si vous avez besoin d'une table de données, vous devrez créer un nouveau de la result de cette requête LINQ.

0

quelque chose de similaire:

var result = dt.AsEnumerable() 
       .Join(id2itm.Keys, 
         row => row[idScColIdx], 
         id => id, 
         (row, id) => row) 
       .Each(ro => {ro[idClmName] = FlagChar; 
          ro[idColorClmName] = FlagColor;}); 

Mon each() est une méthode d'extension, vous pouvez utiliser le code pur:

var result = dt.AsEnumerable() 
       .Join(id2itm.Keys, 
         row => row[idScColIdx], 
         id => id, 
         (row, id) => row); 

foreach (var ro in result) 
{ 
       ro[idClmName] = FlagChar; 
       ro[idColorClmName] = FlagColor;}); 
} 
Questions connexes