Есть ли простой способ объединить два 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;

но это не похоже, лучший способ сделать это.

5 ответов


к сожалению, похоже, что ваш метод может быть так же хорош, как и получается - если BitArray реализовал IEnumerable (а не только 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);
}

Это можно сделать с 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 будет быстрым.


платформа не обеспечивает хороший способ сделать это. Вы можете создать массив модулей, достаточно большой для хранения обоих BitArrays. Затем используйте BitArray.Копировать, чтобы скопировать каждого типа bitarray в массиве значений (вы можете указать, где, чтобы начать вводить элементы).

после этого создайте еще один BitArray с конструктором, который принимает массив bools.

много работы я знаю, но, похоже, другого способа нет. Это меньше кода, чем ваш однако текущий метод.


вот моя реализация 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;
}

это более эффективно, если вы используете 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);
}

In 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