2009-02-05 56 views
6

是否有任何简单的方法来连接两个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; 

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

回答

7

不幸的是,它看起来像你的方法可能会一样好 - 如果BitArray实现IEnumerable <T>(而不只是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); 
} 
+2

如果您知道第一个数组包含32位的偶数倍数,您可以使用int数组而不是bool数组来优化它。 CopyTo与int [],bool []和byte [] – 2009-05-14 13:58:16

2

该框架不提供这样做的一个很好的方式。您可以创建一个大小足以存储两个BitArra的bools数组。然后使用BitArray.CopyTo复制布尔数组中的每个BitArray(您可以指定从哪里开始插入元素)。

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

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

5

人们可以使用LINQ做到这一点,后Cast<bool>()的bitarray '变成' 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()); 

我不认为这LINQ方法是快速的。

-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 
+2

一起使用此代码仅适用于两个传入位数组的长度都是32的倍数的情况 - 否则您会得到越界异常,因为整数除以32将结果向下舍入,“整数”太短。使'整型'更长也是不够的,因为除非'当前'长度是32的倍数,否则附加数组会在中间留下未使用的位,这可能不是人们想要的。 – 2013-08-13 18:05:09

0

这里是我的LINQ实现不包括具有分配的bool数组的开销:

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; 
} 
相关问题