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


Автор: Gesha 17.3.2006, 10:17
Мне надо заполнить двумерный массив некоторыми строками. Я знаю количество столбцов (т.е. один из размеров массива), но я не знаю количество строк!!!
Т.е. есть данные типа

ааа ббб ввв гггг
ппп ввв ддд ккк
.....

Можно ли как-то налету менять второй размер массива? Array.Resize со String[,] вроде не работает!

Рассомтрю любые варианты!


Автор: mr.DUDA 17.3.2006, 10:27
Более менее эффективный способ - сделать ArrayList, куда складывать массивы строк. Потом превратить в массив массивов строк. Пример:

Код
using System;
using System.Collections;

class Test
{
    static void Main(string[] args)
    {
        ArrayList list = new ArrayList();

        list.Add(new string[] { "ааа", "ббб", "ввв" });
        list.Add(new string[] { "ггг", "ддд", "еее" });

        string[][] array = (string[][])list.ToArray(typeof(string[]));
    }
}


Если нужен не массив массивов, а двумерный массив (т.е. надо не "string[][]", а "string[,]"), то наращивать и копировать придётся вручную, каждый раз создавая массив заново с новыми размерами.

Автор: Gesha 17.3.2006, 10:29
Вот пример для одномерного массива:
Код

            int i=0;
            String[] arr = new String[i];
            while(что-то)
            {
                Array.Resize<String>(ref arr, i+1);
                arr[i] = значение.ToString();
                i++;
            }


Мне бы что-то подобное, только для [,] (где [не знаю заранее , знаю заранее])

Или как-нибудь еще..............

Автор: Gesha 17.3.2006, 10:47
mr.DUDA,

Я уже думал про ArrayList. Просто не хотел [][].
Видать таки прийдется...
Спасибо за помощь!

Автор: mr.DUDA 17.3.2006, 11:31
Просто [,] - это на самом деле обычный [], а его двумерность - это синтаксический сахар, не более... Странно, конечно, что в фреймворке не сделали Array.Resize(params int[] newSizes) или наподобие того.

Автор: -ser- 20.3.2006, 04:28
Цитата(mr.DUDA @ 17.3.2006, 11:31 Найти цитируемый пост)
Странно, конечно, что в фреймворке не сделали Array.Resize(params int[] newSizes) или наподобие того.

так они и сделали наподобие того, а точнее именно то
Код

public static void Resize<T> ( ref T[] array, int newSize ) 

и не надо стремиться использовать [,] поскольку по всем характеристикам это куда менее предпочтительно чем [][].

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

Автор: mr.DUDA 20.3.2006, 10:41
Цитата(-ser- @ 20.3.2006, 03:28 Найти цитируемый пост)
так они и сделали наподобие того, а точнее именно то

Я вообще-то другое имел ввиду. Что-то наподобие:

Код
        void Test()
        {
            int[,] arr1 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

            int[,] resized_arr1 = (int[,])ResizeArray<int>(arr1, 2, 3);
        }

        public static Array ResizeArray<TElem>(Array array, params int[] sizes)
        {
            int total_count = 1;
            foreach (int size in sizes) total_count *= size;

            Array ret = Array.CreateInstance(typeof(TElem), sizes);
            Array.Copy(array, ret, total_count);

            return ret;
        }

Автор: -ser- 21.3.2006, 05:59
mr.DUDA, да я тебя понял. ты и сам не хуже их справляешься, я не сомневался.

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

Автор: mr.DUDA 21.3.2006, 08:33
Согласен.

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