从由同一个键索引的多个较小的字典的元素构建字典

时间:2013-02-12 05:34:13

标签: c# performance linq dictionary

我有一个主人Dictionary<int, SolarSystem>和几个较小的Dictionary<int, JumpsHelperClass>Dictionary<int, KillsHelperClass>等。我的SolarSystem课程由这些较小的帮助程序类JumpsHelperClass组成, KillsHelperClass等等。它们都使用相同的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个元素以供参考。

感谢。

1 个答案:

答案 0 :(得分: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()));
            }
        }
    }