Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
Ermintar
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
1

Аналог SetLength

20.11.2011, 20:10. Просмотров 3427. Ответов 11
Метки нет (Все метки)

Подскажите пожалуйста, есть ли в Шарпе аналог SetLength Delphi?
(Задача на работу очереди. Хотела реализвовать массивом с начальным размером 0 и увеличивать при добавлении элементов).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2011, 20:10
Ответы с готовыми решениями:

Аналог memset() из C++ в C#
Какая функция в C# выполняет то же что и memset() из C++?

Аналог getRvalue в С#
аналог getRvalue в С#

Аналог StringGrid в C#
ДОброе время суток! подскажите пожалуйста....только начал вникать в сишарп,...

С# аналог extern в c++ ?
Доброго времени суток. Я писал в с++ borland. сейчас пытаюсь перейти на с#. По...

Аналог union в C#
Всем привет. Нужно взаимодействовать с C-библиотекой. При вызове функции из...

11
Петррр
6160 / 3460 / 897
Регистрация: 28.10.2010
Сообщений: 5,926
20.11.2011, 20:16 2
C#
1
Array.Resize
0
Ermintar
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
20.11.2011, 20:33  [ТС] 3
Вот, я объявила тип массива.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    struct TElements
    {
        public string[] Elements;
    }
 
    class Queue
    {
        private TElements Elements;
        private int head;
        private int tail;
 
        public void Queue()
        {
            head = 0;
            tail = 0;
            Elements = new TElements();
        }
 
        bool IsEmpty()
        {
            return (tail>0);
        }
 
       void Push{
             Array.Resize(Elements, 1);
       }

не работает.
0
Петррр
6160 / 3460 / 897
Регистрация: 28.10.2010
Сообщений: 5,926
20.11.2011, 20:48 4
FAQ для студентов или школьников
0
Ermintar
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
20.11.2011, 21:07  [ТС] 5
C#
1
2
3
4
5
6
7
8
9
10
    public void Enqueue(T item)
    {
        T[] b = new T[array.Length];
        for (int i = 0; i < b.Length; i++)
            b[i] = array[i];
        array = new T[array.Length + 1];
        for (int i = 0; i < b.Length; i++)
            array[i] = b[i];
        array[array.Length - 1] = item;
    }
Но ведь здесь массив фактически перезаписывается, а не добавляется в конец!
Т.е Resize для пользовательского типа использовать нельзя?(
0
Петррр
6160 / 3460 / 897
Регистрация: 28.10.2010
Сообщений: 5,926
20.11.2011, 21:10 6
C#
1
2
3
4
5
public void Enqueue(T item)
{
    Array.Resize(ref array, array.Length + 1);
    array[array.Length - 1] = item;
}
1
kolorotur
Эксперт .NET
10485 / 8673 / 2157
Регистрация: 17.09.2011
Сообщений: 14,888
Завершенные тесты: 1
20.11.2011, 23:22 7
Цитата Сообщение от Ermintar Посмотреть сообщение
Но ведь здесь массив фактически перезаписывается, а не добавляется в конец!
Внутри метода Array.Resize происходит то же самое: создается новый массив с заданным количеством элементов и все элементы из старого массива копируются в новый. После чего ссылка на новый массив присваивается переменной, переданной через ref.
1
Ermintar
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
29.11.2011, 17:28  [ТС] 8
И еще пару вопросов:
1) что "дешевле" завести поле отвечающе за размер массива или постоянно обращаться array.Length?

2) Ресайз вызывает ошибку "Аргументы-типы для метода.. не должны определяться по использованию"

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        private int[] Mas;
        private int MasSize;
 
        public Posled():this(0){}
        public Posled(int NewSize)
        {
            MasSize = NewSize;
            Mas = new int[MasSize];
        }
 
        protected void RewriteArray(ref int[] mas, ref int masSize, int[] newMas, int newMasSize)
        {
            
        }
 
        public void Run()
        {
            int CurLineCount=0;
            int[] CurLine=new int[CurLineCount];
 
            int MaxLineCount = 0;
            int[] MaxMas=new int[MaxLineCount];
            int sum = 0;
            int max = 0;
 
            for (int i=0; i<MasSize; i++)
            {
                if (sum+Mas[i]>0)
                {
                    sum=sum+Mas[i];
                    CurLineCount++;
                    Array.Resize(ref CurLineCount, CurLine);
                    CurLine[CurLineCount-1]=Mas[i];
                    if (sum>max) 
                    {
                        RewriteArray(ref MaxMas,ref MaxLineCount,CurLine,CurLineCount);
                        max=sum;
                    }
                    else
                    if ((sum==max) && (CurLineCount<MaxLineCount))
                        RewriteArray(ref MaxMas,ref MaxLineCount, CurLine, CurLineCount);
                }
                else
                { 
                    //завершили набор подпоследовательности, очищаем
                    sum=0;
                    CurLineCount=0;
                    Array.Resize(ref CurLineCount, CurLine);
                }
            }
0
SpawnDDR
161 / 157 / 19
Регистрация: 22.11.2011
Сообщений: 371
29.11.2011, 17:38 9
Цитата Сообщение от Ermintar Посмотреть сообщение
1) что "дешевле" завести поле отвечающе за размер массива или постоянно обращаться array.Length?
второе, да и Вы точно не ошибётесь, если где-нибудь забудете сохранить размерность...

Цитата Сообщение от Ermintar Посмотреть сообщение
Ресайз вызывает ошибку "Аргументы-типы для метода.. не должны определяться по использованию"
код, который порождает ошибку, можно?
0
Ermintar
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
29.11.2011, 18:00  [ТС] 10
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    class Posled
    {
        private int[] Mas;
        private int MasSize;
 
        public Posled():this(0){}
        public Posled(int NewSize)
        {
            MasSize = NewSize;
            Mas = new int[MasSize];
        }
 
        protected void RewriteArray(ref int[] mas, ref int masSize, int[] newMas, int newMasSize)
        {
            
        }
 
        public void Run()
        {
            int CurLineCount=0;
            int[] CurLine=new int[CurLineCount];
 
            int MaxLineCount = 0;
            int[] MaxMas=new int[MaxLineCount];
            int sum = 0;
            int max = 0;
 
            for (int i=0; i<MasSize; i++)
            {
                if (sum+Mas[i]>0)
                {
                    sum=sum+Mas[i];
                    CurLineCount++;
                    Array.Resize(ref CurLineCount, CurLine);
                    CurLine[CurLineCount-1]=Mas[i];
                    if (sum>max) 
                    {
                        RewriteArray(ref MaxMas,ref MaxLineCount,CurLine,CurLineCount);
                        max=sum;
                    }
                    else
                    if ((sum==max) && (CurLineCount<MaxLineCount))
                        RewriteArray(ref MaxMas,ref MaxLineCount, CurLine, CurLineCount);
                }
                else
                { 
                    //завершили набор подпоследовательности, очищаем
                    sum=0;
                    CurLineCount=0;
                    Array.Resize(ref CurLineCount, CurLine);
                }
            }
        }
Текст ошибки:
Ошибка 1 Аргументы-типы для метода "System.Array.Resize<T>(ref T[], int)" не должны определяться по использованию. Попытайтесь явно определить аргументы-типы.
0
SpawnDDR
161 / 157 / 19
Регистрация: 22.11.2011
Сообщений: 371
29.11.2011, 18:02 11
Цитата Сообщение от Ermintar Посмотреть сообщение
Array.Resize(ref CurLineCount, CurLine);
он ссылку на массив просит, а вы ему зачем в первый параметр int даёте?
1
Ermintar
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 39
29.11.2011, 18:12  [ТС] 12
спасибо. вот что значит, глаз замылился
0
29.11.2011, 18:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2011, 18:12

Аналог eval В С#
Существует ли в С# возможность указать метод при помощи текста, а не ссылки? К...

Аналог CreateObject() в C# ?
В VB6 и, видимо, в VB.NET есть функции CreateOblect(), GetObject. Удобно, если...

Аналог С++ strtol()
Подскажите чем можно получить номер символа в строке, который вызвал ошибку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru