Сделайте методы расширения subarray в C#

Метод Array класса Array класса может копировать подмассив из одного массива в другой, но для этого требуется выяснить, сколько элементов вы хотите скопировать. Он также скопирует части двумерного массива, но только копирует смежные куски, а не прямоугольные фрагменты в середине массива.

Метод Array класса Array класса может копировать подмассив из одного массива в другой, но для этого требуется выяснить, сколько элементов вы хотите скопировать. Он также скопирует части двумерного массива, но только копирует смежные куски, а не прямоугольные фрагменты в середине массива.

...

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

// Скопируйте указанные записи из массива в новый массив.
public static T[] SubArray(this T[] values,
    int start_index, int end_index)
{
    int num_items = end_index - start_index + 1;
    T[] result = new T[num_items];
    Array.Copy(values, start_index, result, 0, num_items);
    return result;
}

Код вычисляет количество элементов для копирования и создает массив для хранения этого количества элементов. Он использует Array.Copy для копирования нужного подмассива в новый массив и возвращает новый массив.

Следующий код использует этот метод расширения для копирования элементов 1 - 3 одномерного массива в новый массив.

// Скопируем массив.
string[] new_values = Values1d.SubArray(1, 3)

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

// Скопируйте указанные записи из двумерного массива
// в новый массив.
public static T[,] SubArray(this T[,] values,
    int row_min, int row_max, int col_min, int col_max)
{
    // Выделить массив результатов.
    int num_rows = row_max - row_min + 1;
    int num_cols = col_max - col_min + 1;
    T[,] result = new T[num_rows, num_cols];

    // Получаем количество столбцов в массиве значений.
    int total_cols = values.GetUpperBound(1) + 1;
    int from_index = row_min * total_cols + col_min;
    int to_index = 0;
    for (int row = 0; row <= num_rows - 1; row++)
    {
        Array.Copy(values, from_index, result, to_index, num_cols);
        from_index += total_cols;
        to_index += num_cols;
    }

    return result;
}

Этот метод вычисляет количество строк и столбцов, которые он должен скопировать, и создает массив для хранения элементов подмассива.

Затем код использует values.GetUpperBound, чтобы получить количество столбцов в исходном массиве и использует это значение для вычисления индекса первого элемента для копирования в значениях tt>. Этот индекс представляет собой количество строк, которые должны быть пропущены, умноженные на размер строки, плюс число столбцов, которые должны быть пропущены для достижения первой записи.

Затем код перебирает необходимое количество строк для копирования подмассива. Для каждой строки, которую он должен скопировать, код использует Array.Copy для копирования необходимого количества записей из исходного массива в позиции from_index в массив результатов в позиции TO_INDEX . Затем код добавляет общее количество столбцов в исходном массиве к from_index, поэтому он перемещается в следующую строку. Точно так же количество столбцов в новом массиве добавляется к to_index, поэтому оно перемещается в следующую строку в этом массиве.

Следующий код использует этот метод расширения для копирования элементов в строках 2-3 и столбцах 1-3 в новый массив.

// Скопируем массив.
string[,] new_values = Values2d.SubArray(2, 3, 1, 3)

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

// Скопируйте указанные записи из одного двумерного
// массива в другой двумерный массив.
public static void CopyTo(this T[,] from_array, T[,] to_array,
    int from_row_min, int from_row_max, int from_col_min,
    int from_col_max, int to_row_min, int to_col_min)
{
    // Получаем количество столбцов в каждом массиве.
    int from_num_cols = from_array.GetUpperBound(1) + 1;
    int to_num_cols = to_array.GetUpperBound(1) + 1;

    // Получим количество строк и столбцов, которые мы скопируем.
    int num_rows = from_row_max - from_row_min + 1;
    int num_cols = from_col_max - from_col_min + 1;

    // Инициализация индексов для копирования.
    int from_index = from_row_min * from_num_cols + from_col_min;
    int to_index = to_row_min * to_num_cols + to_col_min;

    // Копировать.
    for (int row = 0; row <= num_rows - 1; row++)
    {
        Array.Copy(from_array, from_index, to_array, to_index, num_cols);
        from_index += from_num_cols;
        to_index += to_num_cols;
    }
}

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

Следующий код использует этот метод расширения для копирования элементов в строках 2-3 и столбцах 1-3 в новый массив.

// Скопируйте значения и покажите результат.
private void btnCopy2d2_Click(object sender, EventArgs e)
{
    // Выделите новый массив.
    string[,] new_values = new string[
        Values2d.GetUpperBound(0) + 1,
        Values2d.GetUpperBound(1) + 1];

    // Заполните массив значениями ---.
    for (int row = 0; row <= new_values.GetUpperBound(0); row++)
    {
        for (int col = 0; col <= new_values.GetUpperBound(1); col++)
        {
            new_values[row, col] = "------";
        }
    }

    // Скопируем значения.
    Values2d.CopyTo(new_values, 2, 3, 1, 3, 1, 0);

    // Отображение значений.
    ShowValues(lstCopy2d2, new_values);
}

Этот код выделяет новый двумерный массив того же размера, что и исходный массив, и заполняет его записи значением -. Затем он использует метод расширения CopyTo для копирования подмассива в строках 2-3 и столбцах 1-3 в позицию [1, 0] в новом массиве. Метод заканчивается вызовом ShowValues для отображения результата. Метод ShowValues прост, поэтому я не буду показывать его здесь. Загрузите примерную программу, чтобы увидеть, как она работает.

Источник: http://csharphelper.com/blog/2017/10/make-subarray-extension-methods-in-c/

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