هل هناك أي طريقة بسيطة لسلسلة اثنين BitArray (C # .NET)؟

StackOverflow https://stackoverflow.com/questions/518513

  •  21-08-2019
  •  | 
  •  

سؤال

ولدي

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 (بدلا من مجرد 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 تكون سريعة.

والإطار لا يوفر طريقة لطيفة للقيام بذلك. هل يمكن إنشاء مجموعة من bools كبيرة بما يكفي لتخزين كل BitArrays. ثم استخدم BitArray.CopyTo لنسخ كل BitArray في مجموعة من bools (يمكنك تحديد من أين تبدأ إدراج العناصر).

وبعد أن يتم ذلك، إنشاء 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);
}

في 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top