C#字典内部数组大小

我不确定这是否是在这里问的正确问题,但请不要杀死我:)

我和一个朋友关于C#词典有一个争论……
她告诉我,如果我让我说1个元素的字典.密钥的哈希码为100000,则字典的内部数组的大小为100000!

是真的吗我试图在Google上找到答案,但由于某种原因我没有找到该问题.

解决方法:

字典的默认构造函数“具有默认的初始容量” according to MSDN.

它还指出:

If you can estimate the size of the collection, using a constructor that specifies the initial capacity eliminates the need to perform a number of resizing operations while adding elements to the Dictionary.

这样的构造函数只需要使用一个Int32,它就可以初始化内部存储,如下所示:

The initial number of elements that the Dictionary can contain.

字典的“默认初始容量”实际上是该类的内部实现细节,因此未在文档或公共API中公开.

用ilspy拆解mscorlib并检查默认构造函数表明,它的实现方式如下:

public Dictionary() : this(0, null)
{
}

该链接的构造函数实现如下:

public Dictionary(int capacity, IEqualityComparer<TKey> comparer)
{
    if (capacity < 0)
    {
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity);
    }

    if (capacity > 0)
    {
        this.Initialize(capacity);
    }

    this.comparer = (comparer ?? EqualityComparer<TKey>.Default);
}

即默认构造函数根本不直接或间接调用Initialize().

Initialize()是设置内部存储的方法.

因此,实际上,如果您调用默认构造函数,则在您第一次添加项目之前,甚至不会初始化内部存储大小.因此,它的大小基本上为零.

首次调用.Add()时,Initialize()最终将以零值被调用.
设置好了.

private void Initialize(int capacity)
{
    int prime = HashHelpers.GetPrime(capacity);
    this.buckets = new int[prime];
    for (int i = 0; i < this.buckets.Length; i++)
    {
        this.buckets[i] = -1;
    }
    this.entries = new Dictionary<TKey, TValue>.Entry[prime];
    this.freeList = -1;
}

GetPrime(0)返回3,因此this.buckets设置为包含三个整数的数组.

为this.entries赋值的行看起来有些奇怪,但我看不到其中有100000.

简短答案
我认为你的同事错了.

上一篇:pip执行命令过程报错-SyntaxError: invalid syntax


下一篇:android-将图像缓存存储在内部存储器中并重新使用