2009-07-15 12 views
3

System.BitArray implémente uniquement l'élément IEnumerable non générique, qui renvoie un objet pour la propriété IEnumerator.Current. Est-ce que l'exécution d'une foreach sur un bitArray - par exempleEst-ce que l'énumération d'un BitArray cause beaucoup de boxe/unboxing?

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

et unbox chaque valeur de bit? En regardant l'énumérateur de bitarray dans le réflecteur, on dirait qu'il fait un nouveau bitmask à chaque appel de MoveNext() plutôt que quelque chose de plus intelligent. Existe-t-il un moyen plus efficace d'énumérer un BitArray, ou un remplacement pour BitArray qui a les mêmes caractéristiques de stockage? (Liste <bool> etc utilise un octet par bool, plutôt que d'un seul bit, donc utilise 8x autant d'espace)

Répondre

5

Oui, il va causer beaucoup de boxe. Cependant, dans la plupart des cas, je ne m'attendrais pas vraiment à ce que cela nuise à la performance trop beaucoup. C'est embêtant, mais je doute que de nombreuses applications du monde réel passent beaucoup de temps à boxer/déballer (ou à nettoyer les boîtes après, ce qui est évidemment l'autre coût). Cela vaut probablement la peine de vérifier cela avant de faire de gros efforts pour l'éviter.

Vous pourriez écrire votre propre itérateur dessus assez facilement si ... particulièrement si vous ne vous êtes pas soucié de casser si la "version" change. Par exemple:

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

Les mauvaises choses se produiront presque certainement si vous faites changer le tableau alors que nous parcourons bien - surtout si vous changez la longueur!