2016-12-16 27 views
0

私は以下のコードを持っています。次に、ticketStoreが別のメソッドで更新され、このメソッドが再度実行されるまで、ticketStoreNewはticketStoreに設定されます。C#メソッドが実行されていませんが順次

ただし、ticketStoreNew = ticketStore行を含めると、プログラムは空の辞書を返します。メソッドが順番に実行されておらず、これがforループの前に実行されているようです。

実際にはticketStore辞書に追加された新しいアイテムを返すだけでいいです。

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

}

チケットは全てSamanageのAPIからXMLを得ることに基づいています:

EDIT は以下ticketStoreを取得するためのコードです。

+0

ここでは関係だろう。このようticketStoreを更新する方法を記載してください。 –

+0

元の投稿を編集して更新方法を追加しました。チケットストアとそのチケットアイテムはすべて、API呼び出しから引き出されたXMLから生成されます。 –

+0

mike z: 'ticketStoreNew = ticketStore'をあなたのコードに置き換えようとしましたが、同じことをやっています。空の辞書を返しますが、行がコメントアウトされている場合は、いくつかの項目が返されます。 –

答えて

0

別のメソッドがticketStoreを更新する場合、割り当てが問題です。 ticketStoreの内容をticketStoreNewにコピーしません。これは、参照ticketStoreNewを、ticketStoreと同じインスタンスを指すように設定します。したがって、それらは同じオブジェクトであり、常に同じ内容を持ちます。アイテムをコピーするために、新しい辞書を作成してみてください:

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

'ticketStoreNew = ticketStore'という行をあなたのコードに置き換えようとしましたが、同じ効果があります。それは空の辞書を返しますが、行がコメントアウトされると、私はいくつかの結果を得ます。 –

+0

@ J.Galus私はticketStoreNewがどのように初期化されているか分かりませんが、その行をコメントアウトすると、チケットストア内のすべての項目が返される可能性があります。どのような用途ですか?これらのメソッドは複数のスレッドで実行できますか? –

+0

ticketStoreはクラスプロパティです(正しい用語を使用したいと思います)。アプリケーションは、WebサイトからXMLの形式でチケットを取得し、新しいチケットがあれば通知を表示します。 –

0

は、このコードを試してみてください:

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; 
    } 
関連する問題