2009-07-15 7 views
3

System.BitArrayは、IEnumerator.CurrentプロパティのObjectを返す非汎用IEnumerableのみを実装します。 BitArray上でforeachを実行していますか?たとえば、BitArrayを列挙するとボクシング/アンボクシングがたくさんありますか?

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

それぞれのビット値はどれですか?

リフレクタのbitarray列挙子を見ると、clevererではなくMoveNext()のすべての呼び出しで新しいビットマスクが実行されるようです。 BitArrayをより効率的に列挙する方法、または同じストレージ特性を持つBitArrayを置き換える方法はありますか? (リスト<ブール>などは、単一のビットではなく、ブールごとに1バイトを使用するので、8倍のスペースを使用します)

答えて

5

はい、多くのボクシングが発生します。しかし、ほとんどの場合、私は実際にパフォーマンスを傷つけることを期待しません。tooそれは迷惑だが、多くの現実世界のアプリがボクシング/アンボクシングに大量の時間を費やしていることは疑う(または後にボックスをクリーンアップする、それはもちろんその他のコストだ)。あなたがそれを避けるために大きな努力をする前に、それをチェックする価値があります。

あなたはそれをかなり簡単に書くことができます...特に、 "バージョン"が変更された場合には気にしなかった場合。例:あなたがが反復している間、あなたは変更配列を行う場合

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

悪い事はほぼ確実に起こるのだろう - あなたは長さを変更する場合は特に!

関連する問題