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

时间:2009-02-05 23:45:12

标签: c# .net bitarray

我有

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;

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

5 个答案:

答案 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