System.BitArray仅实现非通用IEnumerable,它返回IEnumerator.Current属性的Object。是否在BitArray上运行foreach - 例如
foreach (bool b in bitArray)
{
// ...
}
框并取消每个位值?
查看反射器中的bitarray枚举器,看起来它在每次调用MoveNext()时都会使用新的位掩码而不是更聪明的东西。是否有更有效的方法来枚举BitArray,或者替换具有相同存储特性的BitArray? (List< bool> etc使用每个bool一个字节,而不是一个位,所以使用8x的空间)
答案 0 :(得分:5)
是的,它会引起很多拳击。但是,在大多数情况下,我实际上并不希望这会伤害性能太多。这很烦人,但我怀疑许多真实世界的应用程序花费大量时间装箱/拆箱(或者之后清理箱子,当然这是其他费用)。在你付出任何努力避免它之前,可能值得检查一下。
你可以很容易地在它上面编写自己的迭代器...特别是如果你不关心如果“版本”改变的话。例如:
public static IEnumerable<bool> EnumerateBitArray(BitArray bitArray)
{
for (int i=0; i < bitArray.Length; i++)
{
yield return bitArray[i];
}
}
如果你在迭代时做更改数组,几乎肯定会发生不好的事情 - 特别是如果你改变了长度!