Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как вставить колонки в двумерный массив?


Автор: ZUBR80 22.8.2006, 10:28
Есть массив Cells(5,5) as Integer
Как добавить колонку в этот массив например на позицию 3, т.е. чтобы все значения при этом сместились.

Например, было:

1 2 2 3 8
1 2 2 1 1
2 2 4 7 9
2 1 8 7 7
2 3 4 5 8 

И чтобы стало:

1 2 0 2 3 8
1 2 0 2 1 1
2 2 0 4 7 9
2 1 0 8 7 7
2 3 0 4 5 8 


Автор: ivashkanet 22.8.2006, 10:31
ZUBR80, вручную, батенька, вручную smile
P.S. "Cells(5,5)"  --- а это не Excel случаем? Там можно вставить колонку.

Автор: Bogdan1024 22.8.2006, 10:53
Это статический массив? Тогда тебе нужно сначала присвоить
Cells = Nothing (или что там в VB.NET для слова null?)
Потом создать новый массив Cells(6,5), дальше сам наверно знаешь что делать.

Автор: mr.DUDA 22.8.2006, 11:07
Код
using System;

public class Program
{
    public static void Main()
    {
        // исходные данные
        int[,] array =
        {
            {1, 2, 2, 3, 8},
            {1, 2, 2, 1, 1},
            {2, 2, 4, 7, 1}, 
            {2, 1, 8, 7, 7},
            {2, 3, 4, 5, 8}
        };
        int insertColumnIndex = 2;

        // кол-во колонок и строк
        int numRows = array.GetLength(0);
        int numCols = array.GetLength(1);

        // вставка колонки
        int[,] resized = new int[numRows, numCols + 1];
        for (int iRow = 0; iRow < numRows; iRow++)
        {
            for (int iCol = 0; iCol < numCols; iCol++)
            {
                if (iCol >= insertColumnIndex)
                    resized[iRow, iCol + 1] = array[iRow, iCol];
                else
                    resized[iRow, iCol] = array[iRow, iCol];
            }
        }
    }
}

Автор: ZUBR80 22.8.2006, 11:13
А если массив большой, то наверное использовать метод Array.Copy для порций данных намного быстрее, чем поэлементное копирование? Или я ошибаюсь?

Автор: mr.DUDA 22.8.2006, 11:55
Цитата(ZUBR80 @  22.8.2006,  11:13 Найти цитируемый пост)
А если массив большой, то наверное использовать метод Array.Copy для порций данных намного быстрее, чем поэлементное копирование? Или я ошибаюсь?

Array.Copy не подходит для прямоугольных двумерных массивов.

Автор: Bogdan1024 24.8.2006, 12:37
Цитата
А если массив большой, то наверное использовать метод Array.Copy для порций данных намного быстрее, чем поэлементное копирование? Или я ошибаюсь?

Ошибаешься, мэнэджд код получается одинаковый, это тебе не С smile. Даже медленнее потому что там всякие манипуляции с объектами, проверки, боксинг-анбоксинг и тд.
Цитата(mr.DUDA @  22.8.2006,  11:55 Найти цитируемый пост)
Array.Copy не подходит для прямоугольных двумерных массивов.

Можно извратиться и сделать одномерный массив из струтур-массивов smile

Автор: mr.DUDA 24.8.2006, 12:59
Цитата(Bogdan1024 @  24.8.2006,  12:37 Найти цитируемый пост)
Ошибаешься, мэнэджд код получается одинаковый, это тебе не С . Даже медленнее потому что там всякие манипуляции с объектами, проверки, боксинг-анбоксинг и тд.


Судя по всему - быстрее, т.к. реализация вынесена в unmanaged код:
Код
[MethodImpl(MethodImplOptions.InternalCall), ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)