Как получить список всех Keys из OrderedDictionary без создания новых обьектов?
Есть OrderedDictionary groundColliderCounter.
Все его ключи получаю так:
object[] keys = new object[groundColliderCounter.Keys.Count];
groundColliderCounter.Keys.CopyTo ( keys, 0 );
В GC из-за этого появляется много мусора (частый вызов). Как можно получить ключи без создания работы для GC?
Ответы (1 шт):
Так вы можете и так видеть все ключи через уже используемое вами свойство groundColliderCounter.Keys, зачем же вы делаете их копию, да ещё и таким сложным образом?
- тут хорошо бы уточнить: а нужна ли вам именно копия всех ключей, или достаточно взять уже готовую их коллекцию из свойства Keys и работать с ней.
- если вам всё же нужна копия - нужно задуматься о более специализированной коллекции чем object и, возможно, как-то отфильтровать нужные вам данные.
- если вам абсолютно точно нужна регулярно перезатираемая копия всей коллекции - можно сразу глобально выделить под неё максимально возможный массив элементов нужного типа и копировать коллекцию каждый раз в одно и то же место, не заставляя GC всё время убирать за вами вновь создаваемый большой массив данных.
Но обычно работают как-то всё же потоковым образом - то есть не создают себе копию данных, которые и так уже лежат в памяти, а проходят по имеющейся коллекции, отбирая из неё нужные элементы и обрабатывая их нужным образом прямо вот в процессе перебора. Попутно можно отбирать нужные поля/преобразовывать данные в нужные классы.
foreach(var key in groundColliderCounter.Keys)
{
SomeFunction(key);
}
Либо подобный перебор делают через Linq.