Est-il un moyen simple de concaténer deux BitArray (C # .NET)?
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.
La solution
Malheureusement, il semble que votre méthode pourrait être aussi bon qu'il obtient -. Si BitArray mis en œuvre IEnumerable
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