c# - 字典大小显式初始化: pros and cons

标签 c# .net

假设我们有两个选择:

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;
  }

各有什么优缺点? 最近我们团队发生了争执。

显式大小的可能缺点

  1. 如果项目数量很少,那就没有意义。
  2. 如果项目数量很大,则 Count() 的开销很大,并且会导致 IEnumerable 的完整枚举。
  3. 字典大小调整既有效又快速 - 无需优化。

明确尺寸的可能优点

  1. 精确的数字可以提高性能,因为调整字典大小的成本很高,最好避免这样做。

什么是更好的选择或者有一些经验法则?

最佳答案

如果您正在处理大量项目并且您在 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 .

关于c# - 字典大小显式初始化: pros and cons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20785731/

相关文章:

.net - 如何使用 C# ODP.NET 中的 Oracle Ref Cursor 作为 ReturnValue 参数,而不使用存储函数或过程?

c# - 如何在sql中使用“HAVING "and "ORDER BY”子句

c# - 泛型类型类

c# - Linq 表达式和 foreach 产生不同的结果

c# - List<int> 到 IEnumerable<IComparable>

.net - 如何在 WinForms 应用程序中安全地存储连接字符串?

c# - C# 和 VB 如何处理命名参数之间的差异?

.net - 异常处理

javascript - 将文档上传到 Web API

c# - ItextSharp - 使用 C# 自动填写 pdf 表单 - 复选框问题