Как скопировать строку значений от 2D массива в 1D массив?

Я бы пошел с:

Lead.where.not(phone: User.select(:phone))
16
задан stevehipwell 28 April 2009 в 11:11
поделиться

5 ответов

Следующий код демонстрирует копирование 16 байтов (4 дюймов) из двумерного массива в одномерный массив.

int[,] oGridCells = {{1, 2}, {3, 4}};
int[] oResult = new int[4];
System.Buffer.BlockCopy(oGridCells, 0, oResult, 0, 16);

Вы также можете выборочно скопировать только одну строку из массива, предоставив правильные байтовые смещения. В этом примере копируется средняя строка 3-рядного двумерного массива.

int[,] oGridCells = {{1, 2}, {3, 4}, {5, 6}};
int[] oResult = new int[2];
System.Buffer.BlockCopy(oGridCells, 8, oResult, 0, 8);
29
ответ дан 30 November 2019 в 17:05
поделиться

Редактировать:

Я понял, что есть способ! Конечно, это того не стоит. Используйте небезопасный код . Полный пример, показывающий оба способа, с небезопасным ниже:

public class MultiSingleUnsafe
{
    public static unsafe void Main(String[] a)
    {
    int rowCount = 6;
    int iUpperBound = 10;
    int [,] oGridCells = new int[rowCount, iUpperBound];

    int iIndex = rowCount - 2; // Pick a row.

    for(int i = 0; i < iUpperBound; i++)
    {
        oGridCells[iIndex, i] = i;
    }

    for (int iLoop = 0; iLoop < iUpperBound; iLoop++)
    {
        //Get the value from the 2D array
        int iValue = oGridCells[iIndex, iLoop];
        Console.WriteLine("Multi-dim array access iValue: " + iValue);
        //Do something with iValue
    }

    fixed(int *lastRow = &(oGridCells[iIndex,0]))
    {   
        for (int iLoop = 0; iLoop < iUpperBound; iLoop++)
        {
        int iValue = lastRow[iLoop];
        Console.WriteLine("Pointer access iValue: " + iValue);
        }
    }
    }
}

Я не знаю, как преобразовать многомерный массив в одномерный в C #. Конечно, вы можете создать новый одномерный массив и скопировать в него. Но я не думаю, что это даст выигрыш в производительности, даже если вы перебираете значения несколько раз. Как сказала Дарен, внутренне это все равно арифметика указателей. Если вы хотите быть уверенным, профилируйте его.

2
ответ дан 30 November 2019 в 17:05
поделиться

Невозможно получить ссылку на каждый массив. Однако вы можете использовать зубчатый массив .

1
ответ дан 30 November 2019 в 17:05
поделиться

«Но если бы с массивом сильно манипулировали, то массив с одним измерением был бы более эффективен, чем массив с несколькими измерениями».

Я провел некоторое профилирование именно этим летом и был удивлен чтобы не видеть существенных различий в производительности между массивом 2D и 1D.

Я не тестировал производительность зубчатого массива.

1
ответ дан 30 November 2019 в 17:05
поделиться

Я был бы удивлен, если бы это было возможно: могу поспорить, oGridCells [iIndex, iLoop] - это просто своего рода сокращение (внутренне, в MSIL) для oGridCells [iIndex * iLoop] , и что многомерные массивы являются синтаксическим сахаром для этого.

Чтобы ответить на ваш вопрос: Нет. Вам придется зацикливать значения.

0
ответ дан 30 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: