Question

Je

var previous = new BitArray(new bool[]{true});
var current = new BitArray(new bool[]{false});

Je veux les concaténer. Je l'ai déjà essayé:

var next = new BitArray(previous.Count + current.Count);
var index = 0;
for(;index < previous.Count; index++)
    next[index] = previous[index];
var j = 0;
for(;index < next.Count; index++, j++)
    next[index] = current[j];
previous = current;

Mais il ne ressemble pas à la meilleure façon de le faire.

Était-ce utile?

La solution

Malheureusement, il semble que votre méthode pourrait être aussi bon qu'il obtient -. Si BitArray mis en œuvre IEnumerable (au lieu de simplement IEnumerable) alors nous pourrions utiliser des méthodes d'extension LINQ pour le rendre un peu plus joli

Si je vous, je conclurai cette place dans une méthode d'extension sur BitArray:

public static BitArray Prepend(this BitArray current, BitArray before) {
    var bools = new bool[current.Count + before.Count];
    before.CopyTo(bools, 0);
    current.CopyTo(bools, before.Count);
    return new BitArray(bools);
}

public static BitArray Append(this BitArray current, BitArray after) {
    var bools = new bool[current.Count + after.Count];
    current.CopyTo(bools, 0);
    after.CopyTo(bools, current.Count);
    return new BitArray(bools);
}

Autres conseils

On peut le faire avec LINQ, après la BitArray Cast<bool>() 'devient' IEnumerable<bool>:

var previous = new BitArray(new bool[] { true });
var current = new BitArray(new bool[] { false });

BitArray newBitArray = 
    new BitArray(previous.Cast<bool>().Concat(current.Cast<bool>()).ToArray());

Je ne pense pas que cette méthode LINQ sera rapide.

Le cadre ne fournit pas une bonne façon de le faire. Vous pouvez créer un tableau de bools qui est assez grand pour stocker les deux BitArrays. Utilisez ensuite BitArray.CopyTo pour copier chaque BitArray dans le tableau de bools (vous pouvez spécifier où commencer l'insertion des éléments).

Après cela, créez un autre BitArray avec le constructeur qui accepte un tableau de bools.

Beaucoup de travail je sais, mais il ne semble pas être une autre façon. Il est moins de code que votre méthode actuelle cependant.

Voici ma mise en œuvre LINQ qui ne comprend pas les frais généraux d'avoir à allouer un tableau de bools:

var result = new BitArray(first.Count + second.Count);

var i = 0;
foreach (var value in first.Cast<bool>().Concat(second.Cast<bool>()))
{
    result[i++] = value;
}

Il est plus efficace si vous utilisez int32 au lieu de bools parce que BitArray utilise int32 en interne.

public static BitArray Append(this BitArray current, BitArray after) {
    var ints = new int[(current.Count + after.Count) / 32];
    current.CopyTo(ints, 0);
    after.CopyTo(ints, current.Count / 32);
    return new BitArray(ints);
}

Dans Vb.net si quelqu'un besoin:

<Runtime.CompilerServices.Extension()> _
Public Function Append(ByVal current As BitArray, ByVal after As BitArray) As BitArray
    Dim ints = New Int32((current.Count + after.Count) \ 32 - 1) {}
    current.CopyTo(ints, 0)
    after.CopyTo(ints, current.Count \ 32)
    Return New BitArray(ints)
End Function
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top