Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/55: Рейтинг темы: голосов - 55, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 11.11.2013
Сообщений: 27

На базе обычного массива реализовать свой собственный класс

07.10.2014, 17:47. Показов 11251. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На базе обычного массива (коллекции .NET не использовать) реализовать свой собственный класс
DynamicArray, представляющий собой динамический массив (массив с запасом) для хранения объектов
произвольных типов. Класс должен содержать:
1. Конструктор без параметров (создаётся массив ёмкостью 8 элементов).
2. Конструктор с одним целочисленным параметром (создаётся массив указанной ёмкости).
3. Конструктор, который в качестве параметра принимает коллекцию, реализующую интерфейс
IEnumerable, создаёт массив нужного размера и копирует в него все элементы из коллекции.
4. Метод Add, добавляющий в конец массива один элемент. При нехватке места для добавления
элемента, ёмкость массива должна удваиваться.
5. Метод AddRange, добавляющий в конец массива содержимое коллекции, реализующей интерфейс
IEnumerable. Обратите внимание, метод должен корректно учитывать число элементов в коллекции
с тем, чтобы при необходимости расширения массива делать это только один раз вне зависимости
от числа элементов в добавляемой коллекции.
6. Метод Remove, удаляющий из коллекции указанный элемент. Метод должен возвращать true, если
удаление прошло успешно и false в противном случае. При удалении элементов реальная ёмкость
массива не должна уменьшаться.
7. Метод Insert, позволяющий добавить элемент в произвольную позицию массива (обратите
внимание, может потребоваться расширить массив). Метод должен возвращать true, если
добавление прошло успешно и false в противном случае. При выходе за границу массива должно
генерироваться исключение ArgumentOutOfRangeException.
8. Свойство Length — получение количества элементов. Не путать с ёмкостью (Capacity).
9. Свойство Capacity — получение ёмкости: длины внутреннего массива.
10. Методы, реализующие интерфейсы IEnumerable и IEnumerator.
11. Индексатор, позволяющий работать с элементом с указанным номером. При выходе за границу
массива должно генерироваться исключение ArgumentOutOfRangeException.


Хоть бы первые несколько) Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2014, 17:47
Ответы с готовыми решениями:

На базе обычного массива реализовать свой собственный класс
На базе обычного массива (коллекции .NET не использовать) реализовать свой собственный класс в DynamicArray, представляющий собой массив с...

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

Собственный класс подключения к базе данных
Хочу реализовать интерфейс IDbConnection, но особым образом, есть база данных, доступ к ней только по http и через функцию Getdata(sql...

11
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
07.10.2014, 18:07
Ну вот первые два, дальше попробуй сам, хотя бы несколько
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class DynamicArray
    {
        object[] array;
 
        public DynamicArray()
        {
            array = new object[8];
        }
 
        public DynamicArray(int length)
        {
            array = new object[length];
        }
    }
0
65 / 65 / 16
Регистрация: 07.04.2014
Сообщений: 334
07.10.2014, 18: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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
class MyVector<T1> //: IMyList<T1>
    {
        private static int ARRAY_SIZE = 4;
        private int count = 1;
        private T1[] Vector;
 
        public MyVector()
        {
            Vector = new T1[ARRAY_SIZE];
        }
 
        //число элементов списка
        public int NumberOfElements()
        {
            return Vector.Length;
        }
 
        //добавить элемент в список
        public void AddElement(T1 elem)
        {
            Resize(count);
            Vector[count] = elem;
            count++;
        }
 
        //Добавить элемент по индексу
        public T1 AddToPosition(T1 elem, int index)
        {
            Resize(count+3);
 
            T1 tmp1 = Vector[index];
            T1 tmp2; 
            T1 tmp3; 
            
            try { tmp2 = Vector[index + 1]; }
            catch { return default(T1); }
 
            try { tmp3 = Vector[index + 2]; }
            catch { return default(T1); }
 
            int i = index;
 
            for (; i != Vector.Length; i++)
            {
                Vector[i+1] = tmp1;
                tmp1 = tmp2;
                tmp2 = tmp3;
 
                try { tmp3 = Vector[i + 3]; }
                catch { break; }
            }
 
            Vector[index] = elem;
            count++;
            return default(T1);
        }
 
 
 
 
        //удалить элемент по индексу
        public T1 DeleteElement(int index)
        {
            T1 tmp1; 
            T1 tmp2;
 
            try { tmp1 = Vector[index + 1]; }
            catch { return default(T1); }
 
            try { tmp2 = Vector[index + 2];}
            catch { return default(T1); }
 
            for (; index != Vector.Length; index++)
            {
                Vector[index] = tmp1;
                tmp1 = tmp2;
 
                try { tmp2 = Vector[index + 3]; }
                catch { return default(T1); }
            }
            count--;
            return default(T1);
        }
 
        //прочитать элемент по индексу
        public T1 ReadElement(int index)
        {
            try
            {
                return Vector[index];
            }
            catch
            {
                Console.WriteLine("ERROR. Undefined index.");
                return default(T1);
            }
        }
 
        //записать элемент по индексу
        public T1 WriteElement(T1 elem, int index)
        {
            try
            {
                Vector[index] = elem; ;
            }
            catch
            {
                Console.WriteLine("ERROR. Undefined index.");
                return default(T1);
            }
 
            return default(T1);
        }
 
        //очистить список
        public void DeleteAllElements()
        {
            ARRAY_SIZE = 4;
            Vector = new T1[ARRAY_SIZE];
            count = 0;
        }
 
 
        //Увеличение списка.
        private void Resize(int index)
        {
            if (ARRAY_SIZE < index || ARRAY_SIZE == index)
            {
                while (ARRAY_SIZE < index || ARRAY_SIZE == index)
                {
                    NextSize();
                }
 
                T1[] Garbage = new T1[ARRAY_SIZE];
 
                for (int i = 0; i < Vector.Length; i++)
                {
                    Garbage[i] = Vector[i];
                }
 
                Vector = Garbage;
            }
        }
 
        //Увеличение размера в два раза
        private void NextSize()
        {
            if (ARRAY_SIZE == 0)
            {
                ARRAY_SIZE = 4;
            }
 
            ARRAY_SIZE *= 2;
        }
    }

Но тогда я думал, что крут
0
3 / 3 / 1
Регистрация: 12.02.2015
Сообщений: 50
11.10.2016, 12:06
Сделал 1,2,4,8,9,11. Помогите с остальными пожалуйста.
Вот что думаю по 10(Методы, реализующие интерфейсы IEnumerable и IEnumerator.).

C#
1
2
3
4
5
6
7
8
9
10
11
public int IndexOf(this IEnumerable<T> source, T value)
        {
            int index = 0;
            var comparer = EqualityComparer<T>.Default;
            foreach (T item in source)
            {
                if (comparer.Equals(item, value)) return index;
                index++;
            }
            return -1;
        }
Но у меня подчеркивает class DynamicArray <T> в начале и пишет что метод расширения должен быть определен в неуниверсальном статическом классе
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
11.10.2016, 12:34
Snow88, какое отношение имеет метод IndexOf к реализации интерфейсов IEnumerable и IEnumerator?
0
3 / 3 / 1
Регистрация: 12.02.2015
Сообщений: 50
11.10.2016, 12:48
OwenGlendower, метод IndexOf содержит поле this IEnumerable<T> source. Или я что-то делаю не так?

Добавлено через 3 минуты
Или достаточно в классе DynamicArray <T> написать

C#
1
2
3
4
5
private T [] data;
IEnumerator IEnumerable.GetEnumerator()
    {
        return data.GetEnumerator();
    }
Добавлено через 2 минуты
Предварительно написав конечно же
C#
1
2
3
4
public interface IEnumerable
{
    IEnumerator GetEnumerator();
}
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
11.10.2016, 12:49
Snow88,
3.
C#
1
2
3
4
5
6
7
8
9
class DynamicAray<T>
{
    T[] array;
    public DynamicAray(IEnumerable<T> sourse)
    {
        array = new T[(sourse as ICollection).Count];
        (sourse as ICollection).CopyTo(array, 0);
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
11.10.2016, 13:00
Цитата Сообщение от Snow88 Посмотреть сообщение
метод IndexOf содержит поле this IEnumerable<T> source.
Методы не могут содержать поля. source это аргумент функции. То что тип аргумента это IEnumerable<T> не означает что этот метод является частью реализации интерфейса.

Простейшая реализация интерфейса может выглядеть так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public IEnumerator<T> GetEnumerator()
{
    foreach (T item in data)
    {
        yield return item;
    }
}
 
IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}
В реальности может понадобиться более сложная реализация. Для примера можно посмотреть реализацию класса List<T>.

Цитата Сообщение от Snow88 Посмотреть сообщение
Предварительно написав конечно же
C#
1
2
3
4
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
Интерфейс IEnumerable уже объявлен. Повторно его объявлять не надо. Нужно реализовать.
0
3 / 3 / 1
Регистрация: 12.02.2015
Сообщений: 50
11.10.2016, 13:49
Даценд, спасибо большое. А гляньте на реализацию 6,7

C#
1
2
3
4
5
6
7
8
9
10
private void GrowArray()
        {
            int newLength = data.Length == 0 ? (data.Length * 3) / 2 + 1 : data.Length << 1;            
 
            T[] newArray = new T[newLength];
 
            data.CopyTo(newArray, 0);
 
            data = newArray;
        }
6.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void Insert(int index, T item)
        {
            if (index >= count)
            {
                throw new IndexOutOfRangeException();
            }
 
            if (data.Length == this.count)
            {
                this.GrowArray();
            }
            
            Array.Copy(data, index, data, index + 1, count - index);
 
            data[index] = item;
 
            count++;
        }
7.
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
public void RemoveAt(int index)
        {
            if (index >= count)
            {
                throw new IndexOutOfRangeException();
            }
            int shiftStart = index + 1;
            if (shiftStart < count)
            {                
                Array.Copy(data, shiftStart, data, index, count - shiftStart);
            }
            count--;
        }
 
        public bool Remove(T item)
        {
            for (int i = 0; i < count; i++)
            {
                if (data[i].Equals(item))
                {
                    RemoveAt(i);
                    return true;
                }
            }
            return false;
        }

Так сойдет?

Добавлено через 17 минут
Вот как решал пункт 5.

C#
1
2
3
4
5
6
7
8
9
public void Add(T item)
        {
            if (data.Length == count)
            {
                GrowArray();
            }
 
            data[count++] = item;
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void AddRange(IEnumerable<T> source1)
        {
            throw new NotImplementedException();
        }
 
 
        public void AddRange(IEnumerable<T> source, IEnumerable<T> destination)
        {
            DynamicArray<T> list = destination as DynamicArray<T>;
            if (list != null)
            {
                list.AddRange(source);
            }
            else
            {
                foreach (T item in source)
                {
                    destination.Add(item);
                }
            }
        }
Ругается на destination.Add(item).
Ошибка CS1061 'DynamicArray<T>.IEnumerable<T>" не содержит определения для "Add" и не удалось найти метод расширения "Add", принимающий тип "DynamicArray<T>.IEnumerable<T>" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).

Хотя тут я указал Add
C#
1
2
3
4
5
6
7
8
9
10
public interface ICollection<T> : IEnumerable<T>, IEnumerable
        {
            int Count { get; }
            void Insert(int index, T item);
            void Add(T item);
            void RemoveAt(int index);
            bool Remove(T item);
            int Capacity { get; }
            int Length { get; }
        }
Что не так?

Добавлено через 30 минут
Добавил

C#
1
2
3
4
5
6
7
8
9
10
11
public interface ICollection<T> : IEnumerable<T>, IEnumerable
        {
            int Count { get; }
            void Insert(int index, T item);
            void Add(T item);
            void RemoveAt(int index);
            bool Remove(T item);
            int Capacity { get; }
            int Length { get; }
            IEnumerator GetEnumerator();
        }
Ошибка пропала
1
3 / 3 / 1
Регистрация: 12.02.2015
Сообщений: 50
13.10.2016, 20:35
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
class DynamicArray <T> :IEnumerable, IEnumerable<T>, IEnumerator
    {
 
        int indexforenumenator;
        
        public T Current
        {
            get
            {
                return Current;
            }
        }
 
        public bool MoveNext()
        {
            indexforenumenator++;
            return (indexforenumenator < data.Length);
 
        }
 
        public void Reset()
        {
            indexforenumenator = -1;
        }
 
        public IEnumerator<T> GetEnumerator()
        {
            foreach (T item in data)
            {
                yield return item;
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
Указали на ошибку - не реализовал Reset,что это значит?

Еще - вот такое решение пункта 3 не годится

C#
1
2
3
4
5
6
7
8
9
class DynamicAray<T>
{
    T[] array;
    public DynamicAray(IEnumerable<T> sourse)
    {
        array = new T[(sourse as ICollection).Count];
        (sourse as ICollection).CopyTo(array, 0);
    }
}
Сказали - а что если source не ICollection будет?

Как правильно переделать? Начало как то так
C#
1
data = new T[sourse.Count()];
А вот что дальше? Помогите пожалуйста
1
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
13.10.2016, 22:23
Цитата Сообщение от Snow88 Посмотреть сообщение
Начало как то так
Ну, если можно linq использовать, то тогда
C#
1
2
3
4
5
6
7
8
class DynamicAray<T>
{
    public T[] array;
    public DynamicAray(IEnumerable<T> sourse)
    {
        array = sourse.ToArray();
    }
}
1
3 / 3 / 1
Регистрация: 12.02.2015
Сообщений: 50
13.10.2016, 23:15
Даценд, коллекции .NET не использовать
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2016, 23:15
Помогаю со студенческими работами здесь

Требуется реализовать свой класс MyString
Здравствуйте, стоит задача написать свой собственный класс MyString, описывающий строку как массив символов. Перегрузить для этого класса...

Как свой класс реализовать через формы
Добрый день. Только начал изучать ГУИ на С++. Использовал вот этот гайд http://code-live.ru/post/first-windows-form/ Здесь...

Вывод двумерного массива используя собственный класс
Доброго времени суток! дайте совет что не так сделал. нужно вывести двумерный массив с помощью класса: #include...

Разработать собственный класс, содержащий методы для нахождения количества отрицательных элементов массива
Доброе утро !! Помогите пожалуйста Разработать собственный класс, содержащий методы для нахождения количества отрицательных элементов...

Класс: Реализовать класс Matrix - матрица, на основе двухмерного массива размерности M на N...
1) Реализовать класс Matrix - матрица, на основе двух-мерного целочисленного массива int размерности M на N (кол-во строк и кол-во...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru