2010-11-30 3 views
0
  1. J'ai créé une classe (ConflictingBooking) qui contient des champs pour diverses informations concernant une réservation spécifique.
  2. Je parcours une base de données et sélectionne certaines réservations en fonction de certains critères.
  3. Je souhaite créer une instance de la classe avec les critères sélectionnés.
  4. Je veux ensuite ajouter chacune de ces instances de classe à une liste que je vais utiliser ailleurs.

problème que j'ai est à l'étape 3. Je veux nommer la nouvelle instance quelque chose comme "trouvé [i]" où i est incrémentée pour chaque réservation trouvée:Création d'instances de classes à l'exécution

   ConflictingBooking found = new ConflictingBooking(); 
       found.BookingNumber = conflictingBookingNumber; 
       found.BookingStarts = conflictingBookingDT; 

       conflictingBookings.Add(found); 

Dans le code ci-dessus, Je dois remplacer "trouvé" par programme.

Alors que j'apprécierais un simple extrait de code à suivre, j'aimerais aussi lire quelques références afin que je sache ce que je fais :-). Je ne sais pas comment faire pour google mon problème.

Il semble que je ne l'ai pas été tout à fait clair - est ici le code approprié:

 dbManager.Open(); 
     dbManager.ExecuteReader(CommandType.Text, string.Format("SELECT BookingDate, {0} FROM BTable WHERE Court IN {1} AND BookingDate IN ({2})", columns, facilityIDs, bookingDates)); 
     using (IDataReader rdr = dbManager.DataReader) 
     { 
     decimal conflictingBookingNumber = 0; 
     DateTime conflictingBookingDT; 
     object result = null; 
     while (rdr.Read()) 
     { 
      for (int i = 0; i < requestedColumnNames.Count; i++) 
      { 
      result = dbManager.DataReader[requestedColumnNames[i].ToString()]; 
      if (result != null) 
       conflictingBookingNumber = Convert.ToDecimal(result); 

      result = dbManager.DataReader["BookingDate"]; 
      if (result != null) 
       conflictingBookingDT = Convert.ToDateTime(result); 

      if (conflictingBookingNumber > 0) 
      { 
       int next = conflictingBookings.Count + 1; 


       ConflictingBooking found = new ConflictingBooking(); 
       found.BookingNumber = conflictingBookingNumber; 
       found.BookingStarts = conflictingBookingDT; 

       // conflictingBookings is a List<conflictingBooking> 
       conflictingBookings.Add(found); 
      } 
      } 
     } 
     } 

espoir qui clarifie mon problème.

+0

Que remplacez-vous par 'replace found programatically'? Ma compréhension est que le morceau de code que vous fournissez sera délimité dans une sorte d'itération où vous allez remplir votre collection. Pouvez-vous clarifier s'il vous plait? – JohnP

+0

Alors, quel est exactement le problème avec votre code? L'opérateur 'new' fait exactement cela - crée une nouvelle instance d'une classe. Peut-être que cela vous aiderait si vous clarifiez * pourquoi * vous devez remplacer 'found' qui est un nom de variable. – Serguei

Répondre

2

Je pense que tout ce que vous cherchez est de mettre votre code dans une boucle for. Je pourrais être tout à fait tout malentendu, mais il semble que si vous voulez faire quelque chose comme ça

int i = 0; 
foreach(var result in resultSet) 
{ 
    ConflictingBooking found = new ConflictingBooking(); 
    found.BookingNumber = conflictingBookingNumber; 
    found.BookingStarts = conflictingBookingDT; 
    found.Name = "found["+i++ +"]"; 

    conflictingBookings.Add(found); 
} 

Si ce n'est pas ce que vous voulez s'il vous plaît préciser votre question

+0

Merci - J'ai recommandé mon post original pour inclure la 'boucle' – David

+0

Votre réponse suggère que je n'ai pas besoin d'un nom unique pour l'élément qui doit être ajouté à une liste . Est-ce exact? – David

+0

Oui, le nom est défini dans la boucle, il n'est donc pas nécessaire que la variable change de nom dans la boucle. Le nom n'est lié à l'objet que pendant l'itération de la boucle. Avec la boucle que vous avez ajouté à la question, je ne suis pas sûr de ce que vous demandez maintenant –

0

solution simple: Ajouter le compteur de boucle à votre constructeur:

ConflictingBooking found = new ConflictingBooking(i); 

ajouter ensuite une méthode (ou remplacer ToString()) pour renvoyer le nom de l'instance concaténé chaîne.

+0

Je serais extrêmement surpris si c'était une solution difficile pour toute personne ayant de l'expérience dans ce cas mais j'ai toujours pu éviter cette situation dans le passé mais je pensais qu'il était temps que je l'affronte :-). Y a-t-il une chance que vous postiez le code que vous suggérez en utilisant mon exemple dans la question? – David

+0

Mitch - Je n'ai aucune idée de quoi tu parles! – David

1

Les noms de variables existent uniquement comme une question de commodité à la programmeur, et n'existent pas vraiment à l'exécution. Vous ne pouvez pas produire de variables réelles lors de l'exécution. Comme vous remplissez une liste, vous devez cependant avoir toutes les données nécessaires pour produire un "nom" à des fins d'affichage basé sur l'index. Par exemple:

for(int i = 0; i < conflictingBookings.Length; i++) 
{ 
    Console.WriteLine("found[" + i + "]: " + found.BookingNumber); 
} 
+0

Je pensais avoir besoin d'un nom unique pour ajouter une instance de une classe à la liste. On dirait que ce n'est pas le cas! – David

+0

@David: Je vois. Les "étendues" variables sont ce que vous devriez google, alors. Dans ce cas, la variable "found" n'existe que dans les accolades du bloc "if". – StriplingWarrior

+0

Merci - tout est logique pour moi maintenant. – David

Questions connexes