Как определить текущую емкость словаря C#?


Список имеет отдельные свойства для полученияграфа и егоемкости . Словари, как и все коллекции, также имеют свойствоCount , и оно имеет емкость, потому что оно имеет несколькоконструкторов , которые позволяют вам указать его, и документация для методаAdd упоминает его. Однако я не вижу никакого способа узнать у словаря, какова его текущая емкость.

Даже если нет способа получить текущий словарь емкость, есть ли способ предсказать, когда может произойти перераспределение?

1 2

1 ответ:

Словари работают не совсем так, как списки. Если вы изучите исходный код , предоставленный корпорацией Майкрософт. Вы можете найти несколько частных полей, которые могут быть полезны.

Имейте в виду, что это инкапсулированная деталь реализации, вы не должны зависеть от нее в своем производственном коде, поскольку имена, поведение частных и внутренних членов могут измениться без предварительного уведомления!

У вас есть внутренние массивы int[] buckets и Entry[] entries. У вас также есть int freeList и int 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++;
}