假设我有一个班级:
class C
{
public int uniqueField;
public int otherField;
}
这是实际问题的非常简化版本。我想存储此类的多个实例,其中“uniqueField”对于每个实例应该是唯一的。
在这种情况下哪个更好?
a)以uniqueField为键的字典
Dictionary<int, C> d;
或b)列表?
List<C> l;
在第一种情况(a)中,相同的数据将被存储两次(作为键和作为类实例的字段)。但问题是:在字典中查找元素比在列表中更快吗?或者同样快?
A)
d[searchedUniqueField]
b)中
l.Find(x=>x.uniqueField==searchedUniqueField);
答案 0 :(得分:5)
假设您拥有相当多的实例,那么在字典中查找该项目可能会更快 。基本上Dictionary<,>
是hash table,除了由于碰撞而进行O(1)查找。
现在,如果集合非常小,那么查找哈希码,计算正确的存储桶然后查看该存储桶以匹配哈希码,然后执行密钥相等性检查的额外开销可能需要更长的时间,而不仅仅是检查每个元素在列表中。
如果可能有很多实例,但可能不,我通常会选择字典方法。首先,它表达了您实际尝试实现的目标:通过密钥访问元素的简单方法。小集合的开销不太可能非常显着,除非你有比小集合更小的集合。
答案 1 :(得分:1)
当查找次数大大超过插入次数时使用Dictionary。当你总是少于四个项目时,可以使用List。
答案 2 :(得分:0)
如果您想确保您的客户端不会创建密钥的重复,您可能希望您的类负责创建唯一密钥。因此,一旦唯一密钥生成是类的责任,字典或列表就是客户决定。