是否有任何简单的方法来连接两个BitArray(C#.NET)?

我有

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

我想连接它们。 我已经尝试过了:

 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实现了IEnumerable (而不仅仅是IEnumerable),那么我们可以使用LINQ扩展方法使它更漂亮。

如果我是你,我会把它包装成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); } 

可以使用LINQ执行此操作,在Cast() ,bitarray’变为’ IEnumerable

 var previous = new BitArray(new bool[] { true }); var current = new BitArray(new bool[] { false }); BitArray newBitArray = new BitArray(previous.Cast().Concat(current.Cast()).ToArray()); 

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

该框架没有提供这样做的好方法。 您可以创建一个足够大的bool数组来存储两个BitArrays。 然后使用BitArray.CopyTo复制bool数组中的每个BitArray(您可以指定从哪里开始插入元素)。

完成此操作后,使用接受bool数组的构造函数创建另一个BitArray。

我知道很多工作,但似乎没有其他办法。 然而,它比当前方法的代码少。

这是我的LINQ实现,它不包括必须分配bool数组的开销:

 var result = new BitArray(first.Count + second.Count); var i = 0; foreach (var value in first.Cast().Concat(second.Cast())) { result[i++] = value; } 

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

 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); } 

在Vb.net中,如果有人需要它:

  _ 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