9

我有

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;

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

4

5 回答 5

10

不幸的是,您的方法看起来可能和它一样好 - 如果 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);
}
于 2009-02-05T23:56:38.040 回答
6

Cast<bool>()在位数组“变为”之后,可以使用 LINQ 执行此操作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 方法不会很快。

于 2009-03-12T20:27:03.877 回答
2

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

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

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

于 2009-02-05T23:56:50.537 回答
0

这是我的 LINQ 实现,其中不包括必须分配布尔数组的开销:

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;
}
于 2016-03-06T11:20:17.013 回答
-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
于 2013-07-23T15:51:04.407 回答