2010-09-14 5 views
0

Je dois écrire un script qui fusionne une liste avec un dictionnaire pour créer un troisième dictionnaire. Je suis assez nouveau à la programmation et je me bats avec les bases ici.Utilisation du dictionnaire

Jusqu'à présent, j'ai créé la classe suivante qui génère une liste de dates. J'ai une autre classe qui génère un dictionnaire et je veux fondamentalement créer un troisième dictionnaire qui contient les dates et les données qui n'existent pas déjà dans la première liste. Des idées comment je devrais faire cela? Merci.

class StartList: IDisposable 
{ 
    private readonly string[] names = new[] { "name1", "name2", "name3"}; 

    private SqlConnection conn; 
    private Dictionary<string, List<DateTime>> startData = new Dictionary<string, List<DateTime>>(); 

    public StartList() 
    { 
     this.conn = new SqlConnection(ConfigurationManager.ConnectionStrings["NameCon"].ConnectionString); 
     this.conn.Open(); 
    } 

    private void Dispose() 
    { 
     if (this.conn != null) 
     { 
      if (this.conn.State != ConnectionState.Closed) 
      { 
       try 
       { 
        this.conn.Close(); 
       } 
       catch 
       { 
       } 
      } 

      this.conn.Dispose(); 
      this.conn = null; 
     } 
    } 

    public void ImportStartData() 
    { 
     foreach (string name in this.names) 
     { 
      this.startData.Add(name, this.ImportStartData(name)); 
     } 
    } 

    public List<DateTime> ImportStartData(string name) 
    { 
     List<DateTime> result = new List<DateTime>(); 

     string sqlCommand = string.Format("SELECT * FROM {0}_Index ", name); 

     using (SqlCommand cmd = new SqlCommand(sqlCommand, this.conn)) 
     { 
      cmd.CommandType = CommandType.Text; 

      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        result.Add(reader.GetDateTime(0)); 
       } 
      } 

     } 

     return result; 
    } 

} 
+2

Votre méthode "ImportStartData" est bizarre. Cette méthode parcourt les entrées de "this.names" et procède ensuite à l'ajout d'entrées dans le même "this.names". –

+0

et 'this.names' est' readonly'. Je ne pense pas comprendre. – recursive

+0

Désolé, j'ai fait une faute de frappe dans ImportStartData, j'aurais dû ajouter à startData, pas de noms. Merci – Brian

Répondre

1

Vous devez d'abord modifier le bloc de code ci-dessous De:

public void ImportStartData() 
    { 
     foreach (string name in this.names) 
     { 
      this.names.Add(name, this.ImportStartData(name)); 
     } 
    } 

Pour:

public void ImportStartData() 
    { 
     foreach (string name in this.names) 
     { 
      if(!startData.ContainsKey(name)) //If this check is not done, then Dictionary will throw, duplicate key exception. 
      { 
       this.startData.Add(name, this.ImportStartData(name)); 
      } 
     } 
    } 

Quoi qu'il en soit, la meilleure approche serait, si possible d'abord lire le nom ainsi que Date de la base de données, éventuellement dans un DataTable et le n en utilisant la boucle LINQ/foreach, regroupez les résultats par nom.

+0

Merci pour les heads up Siva. – Brian

+0

Je ne suis pas sûr de votre suggestion. Je n'ai probablement pas expliqué le but correctement. Je suis en train de mettre à jour un certain nombre de tables SQL avec de nouvelles données recueillies à partir d'une feuille Excel. Je commence par extraire les données existantes de SQL, puis je tire les données Excel dans des dictionnaires. Ensuite, je prends les nouveaux dictionnaires et supprime les anciennes données qui existent déjà dans la liste que nous avons peuplé à partir de SQL. – Brian

+0

Voulez-vous dire que vous voulez fusionner les données SQL existantes avec les données de la feuille Excel, puis réécrire les données fusionnées dans des tables SQL? –