Как получить список всех Keys из OrderedDictionary без создания новых обьектов?

Есть OrderedDictionary groundColliderCounter.

Все его ключи получаю так:

object[] keys = new object[groundColliderCounter.Keys.Count];
groundColliderCounter.Keys.CopyTo ( keys, 0 );

В GC из-за этого появляется много мусора (частый вызов). Как можно получить ключи без создания работы для GC?


Ответы (1 шт):

Автор решения: CrazyElf

Так вы можете и так видеть все ключи через уже используемое вами свойство groundColliderCounter.Keys, зачем же вы делаете их копию, да ещё и таким сложным образом?

  • тут хорошо бы уточнить: а нужна ли вам именно копия всех ключей, или достаточно взять уже готовую их коллекцию из свойства Keys и работать с ней.
  • если вам всё же нужна копия - нужно задуматься о более специализированной коллекции чем object и, возможно, как-то отфильтровать нужные вам данные.
  • если вам абсолютно точно нужна регулярно перезатираемая копия всей коллекции - можно сразу глобально выделить под неё максимально возможный массив элементов нужного типа и копировать коллекцию каждый раз в одно и то же место, не заставляя GC всё время убирать за вами вновь создаваемый большой массив данных.

Но обычно работают как-то всё же потоковым образом - то есть не создают себе копию данных, которые и так уже лежат в памяти, а проходят по имеющейся коллекции, отбирая из неё нужные элементы и обрабатывая их нужным образом прямо вот в процессе перебора. Попутно можно отбирать нужные поля/преобразовывать данные в нужные классы.

foreach(var key in groundColliderCounter.Keys)
{
    SomeFunction(key);
}

Либо подобный перебор делают через Linq.

→ Ссылка