两个字典如何相乘

4

有没有更优化的方法来完成以下操作 -

int interactionScore = 0;

        foreach (var completionResult in needs.Keys.Intersect(results.Keys))
        {
            interactionScore -= results[completionResult] * needs[completionResult];
        }

需要和结果都是小型字典(每个字典大约有2-10个条目),但是我运行这个循环的次数非常高,这在我的性能上造成了负担,因此我想知道是否有更有效的方法来实现类似的结果(仅乘以同时存在于两个字典中的条目)。


你不能缓存结果吗?字典会改变吗? - Ulugbek Umirov
第一个基准测试,什么是限制因素?计算字典的交集还是在结果上运行循环? - Alejandro
他们预计会有所改变。虽然不是完全的改变,但如果我找不到更好的解决方案,我将会进行一些缓存,这可能会很麻烦。 - Sen Sorokin
分析器声称Intersect方法内部的交互是最大的罪魁祸首。 - Sen Sorokin
如果有帮助的话,我正在通过几个“结果”运行相同的“需求”,但是每个交集的分数需要单独计算,所以我猜这并没有什么帮助^^'' - Sen Sorokin
变量completionResult是否表示两个字典中都存在的键? - Theodor Zoulias
1个回答

6
避免使用“Intersect”。
int interactionScore = 0;
foreach (var key in needs.Keys)
{
  if (results.TryGetValue(key, out int result))
  {
    int need = needs[key];
    interactionScore -= result * need;
  }
}

啊!TryGetValue。忘记了它。这应该使我不必在已经找到所需内容后再次迭代。 - Sen Sorokin
1
好的,这个函数在分析器中不再高亮显示,所以这就是解决方案。谢谢! - Sen Sorokin
“避免交集” <=== 正确。Intersect 方法适用于可能包含重复值的可枚举对象。字典的键保证不包含重复值(根据指定的 IEqualityComparer),因此在字典键上使用 Intersect 是过度的。 - Theodor Zoulias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接