2016-12-16 6 views
0

Ausführung habe ich den folgenden Code:C# Methode ist nicht sequentiell

public Dictionary<int, Ticket> GetNewTickets() 
    { 
     Dictionary<int, Ticket> output = new Dictionary<int, Ticket>(); 

     foreach (KeyValuePair<int, Ticket> item in ticketStore) 
     { 
      if (!ticketStoreNew.ContainsKey(item.Key)) 
      { 
       output.Add(item.Key, item.Value); 
      } 
     } 

     ticketStoreNew = ticketStore; 

     return output; 
    }` 

Es ein Wörterbuch nimmt, ticketStore, überprüft, um zu sehen, ob es irgendwelche neuen Elemente nicht in ticketStoreNew hat und legt sie in der Ausgabe-Wörterbuch. Dann wird TicketStoreNew auf TicketStore gesetzt, bis TicketStore mit einer anderen Methode aktualisiert wird und diese Methode erneut ausgeführt wird.

Wenn ich jedoch die Zeile ticketStoreNew = ticketStore einfüge, gibt das Programm ein leeres Wörterbuch zurück. Es sieht so aus, als ob die Methode nicht sequentiell ausgeführt wird und vor der for-Schleife ausgeführt wird.

Ich muss wirklich nur alle neuen Elemente, die zum ticketStore Wörterbuch hinzugefügt werden.

EDIT Unten ist der Code für ticketStore bekommen:

public void UpdateTickets(string inputXml) 
{ 
    // If no new tickets exit 
    if (inputXml.Trim() == "") { return; } 
    //xmlString = inputXml; 

    // Load XML into an enumerable 
    XElement xelement = XElement.Parse(inputXml); 
    IEnumerable<XElement> xml = xelement.Elements(); 

    foreach (var item in xml) 
    { 
     if (item.Name == "incident") 
     { 
      int id; 

      // If ID can be converted to INT 
      if (Int32.TryParse(item.Element("id").Value, out id)) 
      { 
       // If ticket is not already in store create ticket and populate data 
       if (!ticketStore.ContainsKey(id)) 
       { 
        Ticket ticket = new Ticket(); 
        ticket.id = id; 
        ticket.number = Int32.Parse(item.Element("number").Value); 
        ticket.title = item.Element("name").Value; 
        ticket.description = item.Element("description").Value; 

        ticketStore.Add(id, ticket); 
       } 
      } 
     } 
    } 
} 

}

Die Karten alle auf dem Erhalten XML aus der SAManage API basieren.

+0

Geben Sie bitte Methode, die ticketStore wie diese aktualisiert würde hier relevant sein. –

+0

Ich habe den ursprünglichen Post bearbeitet, um die Update-Methode einzuschließen. Der Ticketspeicher und seine Ticketelemente werden alle aus XML generiert, das von einem API-Aufruf abgerufen wird. –

+0

mike z: Ich habe versucht, 'ticketStoreNew = ticketStore' mit deinem Code zu ersetzen, aber es macht dasselbe. Es gibt ein leeres Wörterbuch zurück, aber wenn die Zeile auskommentiert ist, werden einige Elemente zurückgegeben. –

Antwort

0

Wenn eine andere Methode TicketStore aktualisiert, ist die Zuweisung das Problem. Der Inhalt von TicketStore wird nicht nach TicketStoreNew kopiert. Dadurch wird das ReferenzticketStoreNew so eingestellt, dass es auf dieselbe Instanz wie TicketStore verweist. Sie sind also das gleiche Objekt und haben immer den gleichen Inhalt. Versuchen Sie, ein neues Wörterbuch zu schaffen um die Elemente zu kopieren:

ticketStoreNew = new Dictionary<int, Ticket>(ticketStore); 
+0

Ich habe versucht, die Zeile "ticketStoreNew = ticketStore" durch Ihren Code zu ersetzen, aber es hat denselben Effekt. Es gibt ein leeres Wörterbuch zurück, aber wenn die Zeile auskommentiert ist, bekomme ich einige Ergebnisse. –

+0

@ J.Galus Ich bin mir nicht sicher, wie ticketStoreNew initialisiert wird, aber das Auskommentieren dieser Zeile würde wahrscheinlich dazu führen, dass es alle Elemente im Ticketspeicher zurückgibt. Welche Art von Anwendung ist das? Können diese Methoden auf mehreren Threads ausgeführt werden? –

+0

TicketStore ist eine Klasseneigenschaft (ich hoffe, ich verwende den richtigen Begriff). Die Anwendung ruft Tickets in Form von XML von einer Website ab und zeigt eine Benachrichtigung an, wenn ein neues Ticket vorhanden ist. –

0

diesen Code versuchen:

private Dictionary<int, Ticket> ticketStoreNew = 
     new Dictionary<int, Ticket>(); // add this line 
    public Dictionary<int, Ticket> GetNewTickets() 
    { 
     Dictionary<int, Ticket> output = new Dictionary<int, Ticket>(); 

     foreach (KeyValuePair<int, Ticket> item in ticketStore) 
     { 
      if (!ticketStoreNew.ContainsKey(item.Key)) 
      { 
       output.Add(item.Key, item.Value); 
       ticketStoreNew.Add(item.Key, item.Value); // add this line 
      } 
     } 

     //ticketStoreNew = ticketStore; remove this line 

     return output; 
    } 
Verwandte Themen