【问题标题】:How can i determine a C# Dictionary's current capacity?如何确定 C# 字典的当前容量?
【发布时间】:2017-02-14 19:40:40
【问题描述】:

列表具有用于获取Count 及其Capacity 的单独属性。字典和所有集合一样,也有Count 属性,它有一个容量,因为它有几个constructors 允许你指定它,Add 方法的文档提到了它。但是,我看不到任何方法可以查询 Dictionary 的当前容量。

即使无法获取 Dictionary 的当前容量,是否有任何方法可以预测何时可能发生重新分配?

【问题讨论】:

  • 字典的工作方式不同,它使用包含具有相似哈希码的项目的存储桶。
  • 我认为你的问题搞错了。如果您预先知道总大小,请在创建时预先分配
  • 字典,作为哈希表,与列表/动态数组根本不同。容量的使用方式并非您可能认为的那样。你为什么想知道它,你认为知道它会对你有什么帮助?

标签: c# dictionary allocation


【解决方案1】:

字典不像列表那样工作。如果您检查微软提供的source code。您可以找到多个可能有用的私有字段。

请注意,这是一个封装的实现细节,您不应在生产代码中依赖它,因为私有和内部成员的名称、行为可能会在没有事先通知的情况下发生变化!

您有内部数组 int[] bucketsEntry[] entries。您还有int freeListint freeCount。您可以使用反射来解决这些问题。

要回答您的问题,是的,每次插入都会触发重新分配,这是实际代码:

int index;
if (freeCount > 0)
{
    index = freeList;
    freeList = entries[index].next;
    freeCount--;
}
else
{
    if (count == entries.Length)
    {
        Resize();
        targetBucket = hashCode % buckets.Length;
    }
    index = count;
    count++;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多