3

System.BitArray 仅实现非泛型 IEnumerable,它为 IEnumerator.Current 属性返回一个对象。是否在 BitArray 上运行 foreach - 例如

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

装箱和拆箱每个位值?

查看反射器中的位数组枚举器,看起来它在每次调用 MoveNext() 时都会执行新的位掩码,而不是更聪明的方法。是否有一种更有效的枚举 BitArray 的方法,或者替代具有相同存储特性的 BitArray?(List<bool> 等每个 bool 使用一个字节,而不是单个位,因此使用 8 倍的空间)

4

1 回答 1

5

是的,它会引起很多拳击。但是,在大多数情况下,我实际上并不认为这会对性能造成太大影响。这很烦人,但我怀疑许多现实世界的应用程序会花费大量时间装箱/拆箱(或事后清理箱子,这当然是另一项成本)。在您竭尽全力避免它之前,可能值得检查一下。

不过,您可以相当容易地编写自己的迭代器……特别是如果您不关心“版本”更改时是否会中断。例如:

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

如果您在迭代时确实更改了数组,几乎肯定会发生不好的事情- 特别是如果您更改长度!

于 2009-07-15T10:50:00.273 回答