2013-02-12 46 views
0

我有一個主索引Dictionary<int, SolarSystem>多個小字典的元素和幾個較小Dictionary<int, JumpsHelperClass>Dictionary<int, KillsHelperClass>,等我SolarSystem類是由這些小助手類JumpsHelperClassKillsHelperClass的,等他們都編入索引由相同的int鍵。大廈詞典由同一個鍵

問題是,這些較小的字典正在填充異步API調用,而我的主類持有主人Dictionary<int, SolarSystem>訂閱時獲得通知,當他們獲取新的信息來更新其主列表。但是,不能保證主列表具有更小列表在更新時要執行的所有密鑰。實際上,主字典可能完全是空的。

我已經試過的方法是這樣的:

void JumpsRequest_UpdatedResults(object sender, EventArgs e) 
    { 
     foreach (int item in JumpsRequest.JumpsBySolarSystemID.Keys) 
     { 
      try 
      { 
       SolarSystemsByID[item].Jumps = JumpsRequest.JumpsBySolarSystemID[item]; 
      } 
      catch (KeyNotFoundException ex) 
      { 
       SolarSystemsByID.Add(item, new SolarSystem(JumpsRequest.JumpsBySolarSystemID[item], new HelperClasses.KillsHelperClass())); 
      } 
     } 
    } 

但是,這是痛苦的低效。每當JumpsRequest從api獲取新信息並更新其Dictionary<int, JumpsHelperClass>時,都會觸發。有沒有一種方法可以以某種方式合併字典,從而避免了每次添加到主服務器時的try catch的開銷。

主字典在任何給定時間都傾向於保存大約4-8k個元素以供參考。

謝謝。

回答

0

如果你擔心的主要事情是try/catch語句,你可以使用的containsKey檢查,如果給定的密鑰嘗試更新之前存在,如:

void JumpsRequest_UpdatedResults(object sender, EventArgs e) 
    { 
     foreach (int item in JumpsRequest.JumpsBySolarSystemID.Keys) 
     { 
      if (SolarSystemsByID.ContainsKey(item)) 
      { 
       SolarSystemsByID[item].Jumps = JumpsRequest.JumpsBySolarSystemID[item]; 
      } 
      else 
      { 
       SolarSystemsByID.Add(item, new SolarSystem(JumpsRequest.JumpsBySolarSystemID[item], new HelperClasses.KillsHelperClass())); 
      } 
     } 
    } 

如果你想避免做兩個查找在字典中(上面的代碼會這樣做),你也可以做類似的事情:

void JumpsRequest_UpdatedResults(object sender, EventArgs e) 
    { 
     foreach (int item in JumpsRequest.JumpsBySolarSystemID.Keys) 
     { 
      SolarSystem system; 
      if (SolarSystemsByID.TryGetValue(item, out system)) 
      { 
       system.Jumps = JumpsRequest.JumpsBySolarSystemID[item]; 
      } 
      else 
      { 
       SolarSystemsByID.Add(item, new SolarSystem(JumpsRequest.JumpsBySolarSystemID[item], new HelperClasses.KillsHelperClass())); 
      } 
     } 
    }