假设我们有两个选择:
public static Dictionary<TK, TV> GetDictionary(IEnumerable<TK> keys)
{
var result = new Dictionary<TK, TV>();
...
return result;
}
对比
public static Dictionary<TK, TV> GetDictionary(IEnumerable<TK> keys)
{
var result = new Dictionary<TK, TV>(keys.Count());
...
return result;
}
各自的优缺点是什么?最近我们团队发生了争执。
显式大小的可能缺点
- 如果项目数量少,则没有意义。
- 如果项目数量很大,则 Count() 会很昂贵并导致
IEnumerable
的完整枚举。
- 字典大小调整有效且快速 - 无需对其进行优化。
显式大小的可能优点
- 精确数字可以提高性能,因为调整字典大小的成本很高,最好避免这样做。
什么是更好的选择或有一些经验法则?
假设您正在处理大量项目并且您在 O(1) 时间内知道这个数字,我会考虑提供 Dictionary
有了这些信息。一般来说,如果预先计算某些东西的成本很低,它可能在某些情况下会有所作为。
因此,在您的情况下,如果您确实处理大量项目,并且能够在不实际枚举所有项目的情况下提供计数(这是 Count()
扩展方法所做的),那么请继续。实际上,这意味着您应该至少传递一个ICollection<T>
进入你的方法:
public static Dictionary<TK, TV> GetDictionary(ICollection<TK> keys)
{
var result = new Dictionary<TK, TV>(keys.Count);
...
return result;
}
如果您不知道 O(1) 时间每次 中的计数,您需要构造该字典,然后 just don't spend time optimizing something that's not causing a performance problem .
我是一名优秀的程序员,十分优秀!