Добавьте полезные расширения в класс BitArray в C#

Пример Использование класса BitArray в C# объясняет, как для использования класса BitArray. Этот пример добавляет некоторые полезные функции в класс BitArray как методы расширения.

В следующем коде показаны методы расширения NumTrue и NumFalse, которые соответственно возвращают число true и false элементов в BitArray.

// Возвращает количество истинных значений в BitArray.
static public int NumTrue(this BitArray bits)
{
    int count = 0;
    foreach (bool value in bits) if (value) count++;
    return count;
}
static public int NumFalse(this BitArray bits)
{
    return bits.Count - bits.NumTrue();
}

Метод NumTrue просто подсчитывает количество записей true в BitArray. Метод NumFalse вычитает NumTrue из общего количества записей в BitArray.

Метод NumTrue просто подсчитывает количество записей true в BitArray. Метод NumFalse вычитает NumTrue из общего количества записей в BitArray.

...

// Возвращает логический И всех записей в массиве.
static public bool AndAll(this BitArray bits)
{
    foreach (bool value in bits) if (!value) return false;
    return true;
}

// Возвращаем логическое ИЛИ всех записей в массиве.
static public bool OrAll(this BitArray bits)
{
    foreach (bool value in bits) if (value) return true;
    return false;
}

Метод AndAll проходит через значения и возвращает false, если есть false. Если все true, он возвращает true.

Метод OrAll проходит через значения и возвращает true, если он есть true. Если все false, он возвращает false.

Вы можете реализовать методы AndAll и OrAll с помощью методов NumTrue и NumFalse, но для этого потребуется изучая каждый элемент в BitArray. (Я оставлю это как довольно легкое упражнение). Показанные здесь методы иногда могут перестать быстро искать значения, чтобы сэкономить время.

Класс BitArray наследует версию класса объекта ToString, поэтому по умолчанию этот метод отображает имя класса «System.Collections.BitArray». Следующий код показывает несколько перегруженные версии метода ToString, который отображает значения объекта BitArray, отформатированные как текст.

// Возвращает строку, показывающую значения BitArray.
static public string ToString(this BitArray bits,
    string true_value, string false_value,
    string separator, int group_size,
    string group_separator)
{
    string result = "";
    for (int i = 0; i < bits.Length; i++)
    {
        // Добавьте значение и разделитель.
        if (bits[i]) result += separator + true_value;
        else result += separator + false_value;

        // Добавьте разделитель групп, если это необходимо.
        if ((i + 1) % group_size == 0) result += group_separator;
    }

    // Удалить начальный разделитель.
    if (result.Length > 0) result =
        result.Substring(separator.Length);
    return result;
}

static public string ToString(this BitArray bits,
    string true_value, string false_value, string separator)
{
    return ToString(bits, true_value, false_value,
        separator, int.MaxValue, "");
}

static public string ToString(this BitArray bits,
    string true_value, string false_value)
{
    return ToString(bits, true_value, false_value, "");
}

Первая перегруженная версия делает интересную работу. Он проходит через значения объекта BitArray. В зависимости от каждого значения он добавляет true_value или false_value к строке результата, за которой следует разделитель. (Обратите внимание, что вы можете сделать разделитель «», если вы не хотите отделять значения.) Затем, если индекс значения плюс 1 является кратным параметру group_size, код вставляет разделитель групп , Это позволяет создавать такие значения, как 00111100 11000100 10000100 01000000.

Две другие перегруженные версии позволяют опустить разделитель групп и разделители групп и значений.

Следующий код показывает, как основная программа демонстрирует методы расширения BitArray.

// Демонстрируем расширения BitArray.
private void Form1_Load(object sender, EventArgs e)
{
    // Создаем BitArray, содержащий IsSquare Xor IsFibonacci.
    BitArray bits = new BitArray(32);
    for (int i = 0; i < bits.Length; i++)
        bits[i] = (IsSquare(i) ^ IsFibonacci(i));

    // Отображение результата различными способами.
    string txt = "";
    txt += "# True: " + bits.NumTrue() + ", " +
        "# False: " + bits.NumFalse() + ", " +
        "AndAll: " + bits.AndAll() + ", " +
        "OrAll: " + bits.OrAll() +
        "\r\n";
    txt += bits.ToString("T", " ") + "\r\n";
    txt += bits.ToString("X", ".") + "\r\n";
    txt += bits.ToString("1", "0", "", 8, " ") + "\r\n";
    txt += bits.ToString("TRUE", "false", " ");
    txtBits.Text = txt;
    txtBits.Select(0, 0);
}

Этот код создает BitArray, где i-я запись истинна, если [i - идеальный квадрат] XOR [является числом Фибоначчи]. Затем он демонстрирует расширение NumTrue, NumFalse, AndAll, OrAll и ToString методы.

Источник: http://csharphelper.com/blog/2016/03/add-useful-extensions-to-the-bitarray-class-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector