使用具有虚拟价值的字典是不好的做法

时间:2017-04-18 01:17:31

标签: c# list dictionary

我们说我有两个项目集合,我想找到他们的交集。

由于这些只是值,而不是键值对,因此通常使用List而不是Dictionary。

然而,找到两个列表的交集需要一个嵌套循环,因此O(n ^ 2)复杂度,而对于Dictionary,所需时间为O(n)。

如果我们处理大量项目,显然我们会尽量避免O(n ^ 2),所以答案很简单。我的问题更多的是项目数量很少而且不太可能增长的情况。

将字典用于:

是否被视为不良做法
  • Key = ItemType
  • 价值= {Dummy}

即使性能不是一个问题,只是为了获得持续的查找能力?我能想到的缺点是:

  1. 使用比必要更复杂的数据结构。
  2. 由于价值是假的,因此会让读者感到困惑。

2 个答案:

答案 0 :(得分:7)

几乎所有 的情况下,您应该支持可读性和可维护性而不是性能,尤其是在这种情况下,除非您的馆藏很大,否则差异可能微不足道。

因此,除非您 证明 通过使用列表的交集存在显着的性能问题,否则您将引入一个很大的可维护性问题获得的。

最后,考虑如果使用具有虚拟值的字典,则已经为cpu / time交换了内存。在某些情况下这可能无关紧要,而在其他情况下可能会成为交易破坏者。

在一天结束时,这感觉就像是过早优化,应该避免。正如评论中其他人所提到的,HashSet<T>等其他选项可以在不编写混淆代码的情况下满足您的性能目标,并且可以使用更少的内存。

答案 1 :(得分:4)

HashSet<T>类在功能上类似于具有虚拟值的Dictionary<T>。它也是为这种集合操作而设计的:

var hashset = new HashSet(myList1);    // this is O(n)
hashset.IntersectWith(myList2);        // this is O(n+m)

https://msdn.microsoft.com/en-us/library/bb293080(v=vs.110).aspx

但正如@ DavidL的回答一样,如果你的藏品相对较小,那真的可能不值得。