0

我有一个 masterDictionary<int, SolarSystem>和几个较小Dictionary<int, JumpsHelperClass>的 ,Dictionary<int, KillsHelperClass>等。我的SolarSystem类由这些较小的辅助类JumpsHelperClass,KillsHelperClass等组成。它们都由相同的int键索引。

问题是,这些较小的字典是由异步 api 调用填充的,而我持有 master 的 master 类Dictionary<int, SolarSystem>订阅,以便在他们获得新信息以更新其 master 列表时得到通知。但是,不能保证主列表具有较小列表在更新时所做的所有键。事实上,主词典可能完全是空的。

我尝试过这样的方法:

    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>. 有没有一种方法可以以某种方式合并字典,避免每次添加到 master 时的 try catch 开销。

主词典倾向于在任何给定时间保存大约 4-8k 个元素以供参考。

谢谢。

4

1 回答 1

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()));
            }
        }
    }
于 2013-02-12T23:34:51.370 回答