2009-07-15 9 views
3

System.BitArray implementiert nur das nicht generische IEnumerable, das ein Object für die IEnumerator.Current-Eigenschaft zurückgibt. Läuft eine foreach über ein BitArray - zBFührt das Aufzählen eines BitArrays zu vielen Boxing/Unboxing?

box und entpacken Sie jedes Bit Wert?

Mit Blick auf den Bitarray-Enumerator im Reflektor sieht es aus, als ob es eine neue Bitmaske bei jedem Aufruf von MoveNext() statt etwas Cleverer tut. Gibt es eine effizientere Möglichkeit zum Aufzählen eines BitArrays oder eines Ersatzes für BitArray mit den gleichen Speichereigenschaften? (Liste <bool> usw. verwendet ein Byte pro Bool, anstatt ein einzelnes Bit, also 8x so viel Platz)

Antwort

5

Ja, es wird eine Menge Boxen verursachen. Allerdings würde ich in den meisten Fällen nicht erwarten, dass die Leistung auch viel zu verletzen. Es ist ärgerlich, aber ich bezweifle, dass viele echte Welt Apps eine beträchtliche Menge an Zeit verbringen Boxen/Unboxing (oder die Boxen danach aufräumen, was natürlich die anderen Kosten ist). Es ist wahrscheinlich wert, das zu überprüfen, bevor Sie zu irgendeiner großen Anstrengung gehen, um es zu vermeiden.

Sie könnten Ihren eigenen Iterator ziemlich einfach darüber schreiben ... vor allem, wenn Sie nicht daran interessiert waren zu brechen, wenn sich die "Version" ändert. Zum Beispiel:

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

Bad Dinge werden mit ziemlicher Sicherheit passieren, wenn Sie Änderung tun das Array, während Sie Iterieren aber - vor allem, wenn Sie die Länge zu ändern!

Verwandte Themen