2010-11-30 30 views
0
  1. Ich habe eine Klasse (ConflictingBooking) erstellt, die Felder für verschiedene Informationen in Bezug auf eine bestimmte Reservierung enthält.
  2. Ich Schleife durch eine Datenbank und wählen Sie bestimmte Reservierungen auf der Grundlage bestimmter Kriterien.
  3. Ich möchte eine Instanz der Klasse mit den ausgewählten bestimmten Kriterien erstellen.
  4. Ich möchte dann jede dieser Klassen-Instanzen zu einer Liste hinzufügen, die ich an anderer Stelle verwenden werde.

Problem ich habe, ist in Schritt 3. ich die neue Instanz so etwas wie "gefunden [i]" nennen will, wo ich für jede Reservierung gefunden erhöht:Erstellen von Instanzen von Klassen zur Laufzeit

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

       conflictingBookings.Add(found); 

In dem obigen Code, Ich muss "gefunden" programmatisch ersetzen.

Während ich ein einfaches Code-Snippet zu schätzen wüsste, würde ich auch gerne eine Referenz lesen, damit ich weiß, was ich mache :-). Ich weiß einfach nicht, wie ich mein Problem googlen soll.

scheint, ich habe nicht ganz klar gewesen - hier ist der entsprechende Code:

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

Hoffnung, dass mein Problem verdeutlicht.

+0

Was genau werden Sie "programmatisch gefunden" ersetzen? Mein Verständnis ist, dass das Stück Code, den Sie zur Verfügung stellen, innerhalb einer Art von Iteration, wo Sie Ihre Sammlung bevölkern werden. Können Sie bitte klarstellen? – JohnP

+0

Was genau ist das Problem mit Ihrem Code? Der "neue" Operator führt genau das aus - erstellt eine neue Instanz einer Klasse. Vielleicht würde es helfen, wenn Sie klären * warum * Sie müssen "gefunden" ersetzen, das ist ein variabler Name. – Serguei

Antwort

2

Ich denke, alles, was Sie suchen, ist, Ihren Code in eine for-Schleife zu setzen. Ich könnte völlig Missverständnis Sie werden, aber es scheint, als ob Sie so etwas wie dieses

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

tun wollen Wenn das nicht das, was Sie wollen, geben Sie bitte Ihre Frage

+0

Vielen Dank - Ich habe meinen ursprünglichen Post mit der 'Schleife' geändert – David

+0

Ihre Antwort schlägt vor, dass ich keinen eindeutigen Namen für das Element benötige, das zu einer Liste hinzugefügt werden soll . Ist das korrekt? – David

+0

Ja, der Name ist innerhalb der Schleife definiert, so dass die Variable die Namen innerhalb der Schleife nicht ändern muss. Der Name wird nur an das Objekt gebunden, während diese Iteration der Schleife auftritt. Mit der Schleife, die Sie der Frage hinzugefügt haben, bin ich mir nicht sicher, was Sie jetzt fragen –

0

Einfache Lösung: Fügen Sie den Schleifenzähler zu Ihrem Konstruktor:

ConflictingBooking found = new ConflictingBooking(i); 

Dann eine Methode hinzufügen (oder außer Kraft setzen ToString()) die Zeichenfolge verketteten Instanznamen zurückzukehren.

+0

Ich wäre sehr überrascht, wenn es eine schwierige Lösung für jemanden mit Erfahrung in diesem Fall wäre, aber ich konnte diese Situation in der Vergangenheit immer vermeiden, dachte aber, es wäre an der Zeit, dass ich es konfrontierte :-). Gibt es eine Chance, dass Sie den Code, den Sie vorschlagen, mit meinem Beispiel in der Frage veröffentlichen. – David

+0

Mitch - Ich habe keine Ahnung wovon du sprichst! – David

1

Variablennamen existieren als eine Frage der Bequemlichkeit der einzige klären Programmierer, und zur Laufzeit nicht wirklich existieren. Sie können zur Laufzeit keine tatsächlichen Variablen erzeugen.

Da Sie jedoch eine Liste ausfüllen, sollten Sie alle Daten haben, die erforderlich sind, um einen "Namen" für Anzeigezwecke basierend auf dem Index zu erstellen. Zum Beispiel:

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

Ich dachte, ich brauche einen eindeutigen Namen, um eine Instanz hinzuzufügen eine Klasse zur Liste. Scheint, das ist nicht der Fall! – David

+0

@David: Ich verstehe. Variable "Scopes" sollten Sie dann googeln. In diesem Fall existiert die Variable "found" nur innerhalb der geschweiften Klammern im "if" -Block. – StriplingWarrior

+0

Danke - alles macht jetzt Sinn für mich. – David

Verwandte Themen