是否有任何简单的方法来连接两个BitArray(C#.NET)?
我是否有任何简单的方法来连接两个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 <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);
}
该框架不提供这样做的一个很好的方式。您可以创建一个大小足以存储两个BitArra的bools数组。然后使用BitArray.CopyTo复制布尔数组中的每个BitArray(您可以指定从哪里开始插入元素)。
完成此操作后,使用接受bools数组的构造函数创建另一个BitArray。
我知道很多工作,但似乎没有其他办法。然而,它比你当前的方法少代码。
人们可以使用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方法是快速的。
如果使用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
一起使用此代码仅适用于两个传入位数组的长度都是32的倍数的情况 - 否则您会得到越界异常,因为整数除以32将结果向下舍入,“整数”太短。使'整型'更长也是不够的,因为除非'当前'长度是32的倍数,否则附加数组会在中间留下未使用的位,这可能不是人们想要的。 – 2013-08-13 18:05:09
这里是我的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;
}
如果您知道第一个数组包含32位的偶数倍数,您可以使用int数组而不是bool数组来优化它。 CopyTo与int [],bool []和byte [] – 2009-05-14 13:58:16