Вызывает ли перечисление BitArray много коробок / распаковок? - PullRequest
3 голосов
/ 15 июля 2009

System.BitArray реализует только неуниверсальный IEnumerable, который возвращает объект для свойства IEnumerator.Current. Работает ли foreach через BitArray - например,

foreach (bool b in bitArray)
{
    // ...
}

поставить и распаковать все значения битов?

Глядя на перечислитель bitarray в отражателе, похоже, что он выполняет новую битовую маску при каждом вызове MoveNext (), а не что-то более умное. Есть ли более эффективный способ перечисления BitArray или замены BitArray, который имеет те же характеристики хранения? (Список и т. Д. Использует один байт на логическое значение, а не один бит, поэтому использует в 8 раз больше места)

1 Ответ

5 голосов
/ 15 июля 2009

Да, это вызовет много бокса. Однако в большинстве случаев я бы не ожидал, что это ухудшит производительность слишком . Это раздражает, но я сомневаюсь, что многие приложения реального мира тратят значительное количество времени на упаковку / распаковку (или очистку ящиков впоследствии, что, конечно же, является другой ценой). Вероятно, стоит проверить это, прежде чем предпринимать какие-либо большие усилия, чтобы избежать этого.

Вы можете написать свой собственный итератор довольно легко, хотя ... особенно если вам не важно ломаться, если "версия" изменится. Например:

public static IEnumerable<bool> EnumerateBitArray(BitArray bitArray)
{
    for (int i=0; i < bitArray.Length; i++)
    {
        yield return bitArray[i];
    }
}

Плохие вещи почти наверняка произойдут, если вы сделаете измените массив во время итерации - особенно если вы измените длину!

...