![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
VeryWell |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 15.3.2009 Репутация: нет Всего: нет |
Доброго всем времени суток!
Я только начал работать на C#, но после Delphi очень тяжело =) Есть задание создать коллекцию фильмов и описать некоторые методы работы ней... Консольное приложение, создаваемое мной использует готовую библиотеку. Я разбираю запись о фильме, а вот правильно сформировать коллекцию фильмов и переслать её между классами не могу сообразить как в моей задачи реализовать. Буду очень благодарен за помощь! Правда много букв =) Вот задание: Имеется текстовый файл, содержащий информацию о фильмах. Файл имеет следующий формат: "<название фильма>" <режиссер> <год выхода> <список актеров через запятую> Описание каждого фильма начинается с новой строки. Пример файла: "The Shawshank Redemption" Frank Darabont 1994 Tim Robbins, Andy Dufresne, Morgan Freeman, Ellis Boyd 'Red' Redding, Bob Gunton, Warden Norton "The Godfather" Francis Ford Coppola 1972 Marlon Brando, Don Vito Corleone, Al Pacino, Michael Corleone Название фильма заключено в кавычки, год всегда содержит 4 цифры, актеры разделяются запятой. Поэтому строка с инфомацией о фильме разбирается однозначно. Имя режиссера гарантированно не содержит 4 цифр ;) Требуется создать класс для хранения информации о фильме. Назовем его условно FilmInfo (имя для примера, можно называть как угодно). Данный класс должен реализовывать интерфейс IFilmInfo.
Требуется создать класс коллекции для хранения списка фильмов. Назовем его условно MultyKeyedCollection (имя для примера, можно называть как угодно). Данный класс будет являться реализацией IList, т.е. в него будут добавляться объекты FilmInfo. При добавлении объекта информации о фильме для него автоматически добавляются ключи. Имя актера будет являться ключем, информация о фильме - значением. Но один актер может присутствовать в нескольких фильмах сразу, т.е. одному ключу может соответствовать несколько значений. Также в одном фильме могут быть несколько актеров, т.е. одному значению могут соответствовать несколько ключей. Создаваемый класс коллекции должен быть универсальным, т.е. быть generic'ом вида: MultyKeyedCollection<TKey, TValue>, где TKey - тип ключа (в нашем случае это string - имя актера), TValue - тип для значения (в нашем случае это класс с информацией о фильме) Для удобства дальнейшего использования, на основе универсального класса MultyKeyedCollection создаем унаследованный класс, представляющие именно коллекцию фильмов. К примеру, так: FilmsCollection : MultyKeyedCollection<string, FilmInfo> {} В классе MultyKeyedCollection требуется обеспечить следующие возможности: 1. Реализация IList - т.е. все возможности, предоставляемые IList - добавление информации о фильме, доступ по индексу, удаление и т.д. 2. Возможность получения коллекции фильмов по имени актера (ключу) при помощи синтаксиса []. Данная коллекция должна быть объектом этого же класса коллекции фильмов. т.е., к примеру, если coll - объект коллекции фильмов, то вызов: FilmsCollection films = coll["Al Pacino"] должен записать в переменную films список фильмов с Аль Пачино. Если ключа нет, то должно бросаться соответствующее исключение. 3. Класс MultyKeyedCollection должен также реализовывать интерфейс IListKey<TKey>, добавляющий следующие возможности: 3.а. функция void Remove(TKey key) - возможность удаления фильмов по ключу (актеру). При удалении ключа (актера) удаляются все фильмы с данным актером. 3.б. функция bool Contains(TKey key) - возвращает, присутствует ли ключ в коллекции, т.е. есть ли в списке фильмы с данным актером Наконец, требуется написать парсер для заполнения MultyKeyedCollection информацией из текстового файла (рекомендуется использовать regex'ы). Данный парсер должен реализовывать интерфейс IFilmsParser<T>, содержащий единственную функцию T Parse(string path); Данная функция возвращает коллекцию, заполненную информацией о фильме. T - это имя класса коллекции, созданного выше (для примера оно было MultyKeyedCollection) path - имя исходного файла Помимо правильности работы будет оцениваться скорость (парсинга, поиска по ключу/значению, удаление и т.п.) Объявления упомянутых интерфейсов IFilmInfo, IListKey<TKey> и IFilmsParser<T> см. в прилагаемой сборке. Они находятся в пространстве имен FilmsList Естественно, все создаваемые классы должны иметь модификатор public. Готовую сборку необходимо оформить в виде dll или exe файла. Пример того, что нужно сделать:
--------------------------------------------------------------------------------------------- Вот то что сделал я:
Необходимо теперь сформировать коллекцию в парсере и закинуть её в MultyKeyCollection, как это сделать? Копирую все, просто не знаю что лишее. За одно то, что здесь разбирутся наверное пиво будут требовать =)) Модератор: Не забывайте обрамлять код тэгом code Это сообщение отредактировал(а) Partizan - 15.3.2009, 20:16 |
||||||||
|
|||||||||
arilou |
|
||||||||||||||||||||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Дело было вечером, делать было нечего
![]() 1. Создаем класс MultiKeyCollection<TKey, TValue> и реализуем в нем IList<TValue> методом агрегации
2. Добавляем в MultiKeyCollection словарь, который будет хранить списки Value по Key:
3. Добавляем интерфейс IKeyProvider<TKey>
Судя по всему, это аналог того, что у тебя называется FilmsList.IListKey<TKey>, но его кода ты не привел, поэтому я додумал сам. 4. Добавляем простой класс с инфой о фильме
5. Имплементим в нем IKeyProvider
6. Накладываем ограничение на typename TValue следующим образом
Это нужно для того, чтобы при добавлении новых элементов в список из них автоматически получался список ключей, который они поддерживают. 7. Добавляем вспомогательные методы для синхронизации _values и _valuesByKey (Add и Remove)
8. Добавляем индексатор this[TKey], возвращающий IEnumerable<TValue>
9. Расширяем имплементацию методов, модифицирующих список _values с тем, чтобы синхронизировать его со словарем _valuesByKey, вызывая _Add или _Remove по необходимости. Класс MultiKeyCollection теперь выглядит следующим образом:
10. Теперь добавим для удобства override ToString() в FilmInfo
11. И наконец, добавим тестовый пример.
Рабочий код приаттачен. Демонстрируется решение первой половины поставленой задачи -- создание коллекции, поддерживающей хранение объектов одновременно по нескольким ключам. По скорости даже не знаю, вроде как оптимально. Остальное ты вполне в состоянии сделать сам. Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
||||||||||||||||||||||
|
|||||||||||||||||||||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |