ARMS_DEIR Ответов: 2

Как скопировать две строки массива в другую?


Привет,

У меня есть массив (tempData) следующего вида:
double[,] tempData = new double[numDtPts, 8];

который загружается из txt-файла. Для меня это означает матрицу из n строк и 8 столбцов. Я хотел бы скопировать первый и восьмой столбцы в другой массив (y) как:
private double[,] y = null;

y = new double[numDtPts, 2];

Вопрос в том, как скопировать их в новый массив.

Я с нетерпением жду ваших ответов.
Спасибо
РУКИ

Что я уже пробовал:

Я погуглил и не нашел прямого ответа. А так как я не профи-программист, то ни к каким разумным ответам не пришел.
Следующий код я использую для копирования всех tempData в y, но невозможно выбрать, какой столбец мне нужен.

Array.Copy(tempData, 0, y, 0, numDtPts + 7);

Dave Kreskowiak

Твой вопрос не имеет никакого смысла. Вы хотите скопировать первую строку значений, содержащую 8 значений (или столбцов), в другой массив, который, по-видимому, содержит только два значения в строке. Это не имеет смысла.

Кроме того, что вы подразумеваете под "восьмеркой"?

Может быть, пример или то, что вы хотите сделать, прояснит ситуацию?

ARMS_DEIR

Привет Дэйв,

Спасибо за заботу. Я исправил вопрос. Я хочу скопировать первый столбец моего первого массива в первый столбец второго массива и снова восьмой столбец первого массива во второй столбец второго массива!

с уважением
АМ

2 Ответов

Рейтинг:
2

BillWoodruff

Во-первых, если и исходный массив, который вы используете, и целевой массив, в который вы собираетесь скопировать, оба имеют одинаковый ранг (количество измерений) и имеют один и тот же тип, и вы хотите скопировать строку или некоторое количество строк, то вы можете использовать различные методы копирования в классе Array: [^].

Вот универсальная функция общего назначения, которую я использовал в прошлом, чтобы получить копию строки или столбца (т. е. результат одномерного массива того же типа, что и значения исходного массива) массива из двумерного массива:

// bw: revised May, 2005
public T[] CopyRowOrColumn<T>(int ndx, T[,] sourceAry, bool isrow = true)
{
    T[] resultAry;

    int rank = sourceAry.Rank;

    if(sourceAry == null || rank != 2) throw new ArgumentException("requires a two-dimensional array as input that contains values");

    int rowdim = sourceAry.GetLength(0);
    int coldim = sourceAry.GetLength(1);

    if (isrow)
    {
        if(ndx > rowdim) throw new  ArgumentException("index greater than row dimension");
        resultAry = new T[coldim];;
    }
    else
    {
        if(ndx > coldim) throw new ArgumentException("index greater than column dimension");
        
        resultAry = new T[rowdim];
    }

    T value;

    for (int row = 0; row < rowdim; row++)
    {
        for (int col = 0; col < coldim; col++)
        {       
            value = sourceAry[row, col];

            if (isrow && row == ndx)
            {
                resultAry[col] = value;
            }
            else  if(col == ndx)
            {
                resultAry[row] = value;
            }
        }
    }

    return resultAry;
}
Пример использования:
var testrow = CopyRowOrColumn<double>(2, dblAry, true);
var testcol = CopyRowOrColumn<double>(2, dblAry, false)

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

Хорошие вещи, чтобы понять в теории и на практике, о массивах:

1. часто вы можете избежать большой "ворчливой" работы, используя вместо этого общие списки.

2.Array. Rank: количество измерений массива

3. в 'массиве.Способ метода getlength может служить метод, который возвращает размер конкретного измерения массива


Рейтинг:
15

Dave Kreskowiak

Вы должны перебирать все строки и копировать каждое значение по отдельности. Массив.Копирование не будет работать так, как оно работает со строками, а не с колонками.

Что-то вроде этого:

int rows = tempdata.GetUpperBound(0);

for (int index = 0; index <= rows; index++)
{
    y[index, 0] = tempdata[index, 0];
    y[index, 1] = tempdata[index, 7];
}


BillWoodruff

Массив.Копирование и его вариации работают с некоторой последовательностью элементов в последовательном расположении массива в памяти; эта последовательность может включать "части" строки, если диапазон извлекаемых значений не выровнен по строкам.

Dave Kreskowiak

Я знаю это, но это, имхо, немного более подробное объяснение, чем подготовлено операцией.