Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение размерности массива, c# 
:(
    Опции темы
Gesha
  Дата 17.3.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 5.10.2005

Репутация: нет
Всего: 2



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

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

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

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


--------------------
PM MAIL ICQ   Вверх
mr.DUDA
Дата 17.3.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Более менее эффективный способ - сделать 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[,]"), то наращивать и копировать придётся вручную, каждый раз создавая массив заново с новыми размерами.


--------------------
user posted image
PM MAIL WWW   Вверх
Gesha
Дата 17.3.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 5.10.2005

Репутация: нет
Всего: 2



Вот пример для одномерного массива:
Код

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


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

Или как-нибудь еще..............
--------------------
PM MAIL ICQ   Вверх
Gesha
Дата 17.3.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 5.10.2005

Репутация: нет
Всего: 2



mr.DUDA,

Я уже думал про ArrayList. Просто не хотел [][].
Видать таки прийдется...
Спасибо за помощь!
--------------------
PM MAIL ICQ   Вверх
mr.DUDA
Дата 17.3.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



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


--------------------
user posted image
PM MAIL WWW   Вверх
-ser-
Дата 20.3.2006, 04:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



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

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

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

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

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



--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 20.3.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(-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;
        }



--------------------
user posted image
PM MAIL WWW   Вверх
-ser-
Дата 21.3.2006, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



mr.DUDA, да я тебя понял. ты и сам не хуже их справляешься, я не сомневался.

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



--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
mr.DUDA
Дата 21.3.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Согласен.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.