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

Как реализовать собственную коллекцию?

30.11.2014, 13:22. Показов 3312. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Задача состоит в следующем: надо реализовать список заданий(не List<>). Есть класс ToDoList, который позволяет добавить задание, найти по тэгу задание, вернуть последнее задание по дате. Также есть базовый класс Task, в котором хранятся элементы задания(заголовок, текст задания, дата задания и списко тэгов(не List<>)).
Преподователь сказал надо использовать что-то типо IENumerable и прочее. Но IEnumerable не позволяет добавлять элемента, тогда я нашел ICollection, но все равно что-то туплю.

1)Как в базовом классе правильно реализовать свойство для tags, чтобы потом можно было добавлять элементы в коллекцию вне класса?
2)Как в конструкторе добавить тэги из другого объекта?
3)В чем ошибка в реализации метода Clone? По идее же создается новый объект и возвращается.
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
public class Task : ICloneable, IComparable<Task>
        {
            /*...*/
            private ICollection<string> tags;
            /*...*/   
            public ICollection<string> Tags
            {
                get { return tags; }
                set { tags.Concat(value); }
            }
            public Task(Task tmp)
            {
                Title = tmp.Title;
                Description = tmp.Description;
                Day = tmp.Day;
                Month = tmp.Month;
                Year = tmp.Year;
                Tags = new string[]{tmp.Tags}; // Как добавить тэги? выдает ошибку.
            }           
            /*...*/
            public object Clone()
            {
                return new Task(this);
            }            
        }
4) Опять вот вопрос к свойству: как его реализовать, чтобы потом можно было добавлять элементы в коллекцию вне класса?
5)Можно ли в методе AddTask добавить в tasklist таким способом объект Task?
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
public class ToDoList
        {
            private ICollection<Task> tasklist;
            public ICollection<Task> Tasklist
            {
                get { return tasklist; }
                set { tasklist.Concat(value); }
            } 
            public ToDoList()
            {
                tasklist = new Task[] { new Task() };
            }
            // Добавление задания в список.
            public void AddTask(Task tmp)
            {
                tasklist = new Task[]{tmp};
            }
            // Поиск заданий в списке по тэгу.
            public IEnumerable<Task> SearchTask(string tags)
            {
                return tasklist.Where(t => t.Tags.Any(tag => tags.Contains(tag))).ToArray();
            }
            // Вывод последнего задания.
            public Task LastTask()
            {
                return tasklist.Max();
            }
        }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.11.2014, 13:22
Ответы с готовыми решениями:

Как реализовать пользовательскую коллекцию в виде структуры, или преобразовать класс коллекции LIst в структуру
Столкнулся с вопросом создания пользовательской коллекции в виде структуры. Из всех источников более мене что-то описано по данной теме...

Реализовать коллекцию
Задание. Создать класс Student с двумя полями и конструктором с параметрами. Если нужно добавить в класс дополнительные методы или...

Реализовать класс-коллекцию, хранящую элементы в виде списка массивов
Приветствую! Дана такая задача: &quot;реализовать класс-коллекцию , хранящую элементы в виде сложной структуры — списка массивов. Сравнить время...

5
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
30.11.2014, 13:36
Острослав,
1) Создайте метод Add и добавляйте в ваш массив данные
2) Передать ссылку на другой объект и скопировать, или передать сами теги
3)
Цитата Сообщение от Острослав Посмотреть сообщение
C#
1
2
3
4
public object Clone()
{
    return new Task(this);
}
У метода по сигнатуре необходимо возвращать object, и для такиз вещей используют MemberwiseClone
4) Какое отличие от 1го вопроса?
5) Можно, почему бы такой вопрос и самому не проверить?
1
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 37
30.11.2014, 14:08  [ТС]
Вот у меня свойство:
C#
1
2
3
4
5
public ICollection<string> Tags
            {
                get { return tags; }
                set { tags.Concat(value); }
            }
Где-то вне класса я хочу добавить тэг:
C#
1
tmp.Tags = new string[] {str_};
Но выкидывается экспешн: Unhandled Exception: System.ArgumentNullException: Value cannot be null.
Я же передал массив (тип str_ - string), а выдает, что null передан.
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
30.11.2014, 14:17
Острослав,
У вас же tasklist равен null, вы же не создаете его
1
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 37
30.11.2014, 14:33  [ТС]
Я попробовал так, но все равно не работает:
C#
1
2
3
4
public ToDoList()
            {
                tasklist = new List<Task> { new Task() };
            }
0
What? Where? Why?
106 / 106 / 32
Регистрация: 16.10.2012
Сообщений: 459
30.11.2014, 21:35
Лучший ответ Сообщение было отмечено Острослав как решение

Решение

Вы изначально суть не правильно понимаете. Использовать листы можно. Но только внутри класса, а возвращать нужно IEnumerable.
Это нужно было для того, чтобы никто не смог добавить в вашу коллекцию данные минуя ваш класс. Потому что если возвращать сразу List, то передается ссылка на него, и т.к. это лист, то он поддерживает метод Add. А IEnumerable не поддерживает.
Вот пример, который даст всё понять:
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
public class Element
    {
        public string name { get; set; }
        public Element(string Name)
        {
            this.name = Name;
        }
    }
 
    public class ElemCollaction
    {
        private List<Element> collaction;
        public ElemCollaction(IEnumerable<Element> Collaction)
        {
            this.collaction = new List<Element>(Collaction);
        }
 
        public IEnumerable<Element> GetElements()
        {
            return this.collaction;
        }
 
        public List<Element> GetElementsList()
        {
            return this.collaction;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Element> tmp = new List<Element>();
            tmp.Add(new Element("Игорь"));
            tmp.Add(new Element("Игорь"));
 
            ElemCollaction elemCollaction = new ElemCollaction(tmp);
            List<Element> LEnum = elemCollaction.GetElements().ToList<Element>();
            List<Element> LList = elemCollaction.GetElementsList();
 
            LEnum.Add(new Element("Новый"));
            foreach (var el in elemCollaction.GetElements())
                Console.WriteLine(el.name);
           
            Console.WriteLine();
 
            LList.Add(new Element("Новый"));
            foreach (var el in elemCollaction.GetElements())
                Console.WriteLine(el.name);
        }
    }
Вывод:
Игорь
Игорь

Игорь
Игорь
Новый
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2014, 21:35
Помогаю со студенческими работами здесь

Как реализовать коллекцию?
Здравствуйте. У меня был вот такой код: Создан массив автобуса: Bus bus = new Bus(max_seats, enter_number, passeng); Аргумент...

Реализовать программу вывода информации про собственную семью
реалізувати програму виводу інформації про власну родину. Оформити вивід за наступним зразком. Реализовать программу вывода информации...

Реализовать класс который должен асинхронно выгружать данные из бд и возвращать коллекцию
есть класс который должен асинхронно выгружать данные из бд и возвращать коллекцию class CategoryHelper:EntityHelper&lt;Category&gt; ...

Как применить собственную клавиатуру?
Всем привет) Я сделал свою клавиатуру но не подумал об этом( как прошить его к девайсу?? прогуглил ничо толком не нашел,,должен же быть...

Как создать собственную библиотеку?
А как собственно это сделать? Я выбираю файл - шаблон проекта - библиотека классов. Создается проект и нигде нету файла с расширением dll.


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru