我有
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;
但它看起来不是最好的方法。
答案 0 :(得分:9)
不幸的是,如果BitArray实现了IEnumerable&lt; T&gt;,那么看起来你的方法可能会很好。 (而不仅仅是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);
}
答案 1 :(得分:5)
在Cast<bool>()
比特阵“成为'IEnumerable<bool>
之后,可以使用LINQ执行此操作:
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());
我认为这种LINQ方法不会很快。
答案 2 :(得分:2)
框架没有提供这样做的好方法。您可以创建一个足够大的bool数组来存储两个BitArrays。然后使用BitArray.CopyTo复制bool数组中的每个BitArray(您可以指定从哪里开始插入元素)。
完成此操作后,使用接受bool数组的构造函数创建另一个BitArray。
我知道很多工作,但似乎没有其他办法。然而,它的代码少于当前的方法。
答案 3 :(得分:0)
这是我的LINQ实现,它不包括必须分配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;
}
答案 4 :(得分:-1)
如果使用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中,如果有人需要它:
<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