Два вопроса по C#
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Два вопроса по C# Expand / Collapse
Автор
Сообщение
05.08.2006 21:01
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 22.01.2008 17:30
Сообщ.: 43, Visits: 366
1. У объекта Obj есть метод со следующей сигнатурой:

Method(ref System.Array b)

Мне надо передать ему массив double[] d.
Не нашёл нечего лучшего как:

Array a;
a=d;
Obj.Method(ref a);

Но это не комильфо...
А как надо?

2. Как в С# реализовать следующий VB'шный оператор:

ReDim Preserve buf(N)

Сообщ. #902097
05.08.2006 22:25
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
2. надо создать второй массив

string[] buf2 = new string[N];
Array.Copy(buf, buf2, buf.Length);

Сообщ. #902098
06.08.2006 0:48


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 29.10.2007 19:07
Сообщ.: 292, Visits: 3 426
2. В С# нет аналога как VB.NET оператора переопределения размера массива - ReDim

поэтому копируй массив как указал Алексей

Сообщ. #902101
06.08.2006 7:01
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 22.01.2008 17:30
Сообщ.: 43, Visits: 366
Прошу пардону, забыл сказзать, что:

- аналог Redim'a должен стоять в цикле;
- число шагов цикла заранее неизвестно;
- на каждом шаге цикла размер buf'а возрастает.

Поэтому к предложенному решению придётся добавить ещё два действия:

- увеличить размер buf'а;
- обратно скрпировать данные из buf2 в buf.

Но два копирования - что-то многовато. Не верится, что внутренняя реализация ReDim'a
использует два копирования.
Получается, что в данном случае VB рулит?

Сообщ. #902103
06.08.2006 12:06
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
попробуй пересмотреть логику в сторону ухода от "redim'ов" в цикле.
Сообщ. #902105
06.08.2006 13:50


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
1. Видимо, иначе никак, т.к. "A ref or out argument must be an assignable variable". А поэтому TypeCast тут не пройдет.

2. Array.Resize<T>(ref T[] arr, int newSize). А вообще, если явление массвое, то лучше избегать этого и использовать списки или MemoryStream, а потом приводить их к массиву (ToArray();)


Сообщ. #902109
17.08.2006 14:13


новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 18.08.2006 17:53
Сообщ.: 3, Visits: 5
Вопрос к инициатору темы : а заморочка имеет под собой основание? Не проще ли использовать ArrayList или HashTable? Не надо задавать длину массива, можно постоянно добавлять элементы.

--
Корректно поставленный вопрос содержит 50% ответа
Сообщ. #902874
13.09.2006 9:40
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 22.01.2008 17:30
Сообщ.: 43, Visits: 366
Method(...) - не мой и я не могу менять его сигнатуру.
Сообщ. #904313
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl