我有一个主人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个元素以供参考。
感谢。
答案 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()));
}
}
}