有没有简单的方法来连接两个位数组(C#.NET)?

有没有简单的方法来连接两个位数组(C#.NET)?,c#,.net,bitarray,C#,.net,Bitarray,我有 我想把它们连接起来。我已经试过: var previous = new BitArray(new bool[]{true}); var current = new BitArray(new bool[]{false}); var next=新的位数组(previous.Count+current.Count); var指数=0; 对于(;索引

我有

我想把它们连接起来。我已经试过:

var previous = new BitArray(new bool[]{true});
var current = new BitArray(new bool[]{false});
var next=新的位数组(previous.Count+current.Count);
var指数=0;
对于(;索引

但这看起来并不是最好的方法。

不幸的是,您的方法看起来可能与它得到的一样好-如果BitArray实现了IEnumerable(而不仅仅是IEnumerable),那么我们可以使用LINQ扩展方法使它更漂亮

如果我是你,我会将其封装到BitArray上的扩展方法中:

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;

该框架没有提供一种很好的方法来实现这一点。您可以创建一个足够大的布尔数组来存储两个位数组。然后使用BitArray.CopyTo复制布尔数组中的每个BitArray(您可以指定从何处开始插入元素)

完成后,使用接受布尔数组的构造函数创建另一个位数组


我知道有很多工作,但似乎没有别的办法。但是,它的代码比您当前的方法要少。

可以使用LINQ执行此操作,在
Cast()之后,
位数组“变为”
IEnumerable

var-previous=new位数组(new bool[]{true});
var current=新的位数组(新的bool[]{false});
位数组newBitArray=
新的位数组(previous.Cast().Concat(current.Cast()).ToArray());

我认为这种LINQ方法不会很快

如果使用int32而不是bools,效率会更高,因为bitarray在内部使用int32

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());
在Vb.net中,如果有人需要:

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);
}
_
公共函数追加(ByVal当前作为BitArray,ByVal之后作为BitArray)作为BitArray
Dim ints=New Int32((current.Count+after.Count)\32-1){
当前.CopyTo(整数,0)
.CopyTo之后(整数,当前.Count\32)
返回新的位数组(整数)
端函数

以下是我的LINQ实现,它不包括分配布尔数组的开销:

<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
var result=新的位数组(first.Count+second.Count);
var i=0;
foreach(first.Cast().Concat(second.Cast())中的var值)
{
结果[i++]=数值;
}

如果您知道第一个数组包含32位的偶数倍,您可以使用int数组而不是bool数组来显著优化它。CopyTo与int[]、bool[]和byte[]配合使用此代码仅在两个传入位数组的长度均为32的倍数时有效-否则会出现越界异常,因为整数除以32会向下舍入结果,从而使“int”太短。“int”的长度也不够,因为除非“当前”长度是32的倍数,附加数组将在中间留下未使用的位,这可能不是人们想要的。好主意,但是正如@克里斯蒂安韦德伯格提到的那样,只有在某些(稀有)条件下才能工作。
<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
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;
}