С# Коллекционные классы - да или нет
Я относительный новичок на С#, хотя я компетентный программист, и я признаюсь, что я совершенно смущен относительно того, хорошо ли писать пользовательские коллекции. Так много людей, кажется, говорят "не надо", но для С# существует целый набор базовых классов.
Вот мой конкретный случай. У меня есть приложение для расписания. Как часть этого, у меня есть класс обслуживания, а класс службы содержит коллекции вещей service-y, такие как ссылки маршрута. Ссылка маршрута сама по себе является настраиваемым классом:
public class Service
{
public RouteLinks RL; // A collection of RouteLink types
...
}
public class RouteLink
{
public string FirstStopRef;
public string LastStopRef;
public Tracks RouteTrack; // Another collection, this time of Track types
}
До сих пор я рассматривал использование словаря как типа для RouteLinks, потому что мне нужно иметь возможность ссылаться на них. Это в принципе. Тем не менее, процесс добавления RouteLink в коллекцию RouteLinks включает проверку того, существует ли она там, или расширяет ли она существующую ссылку маршрута, или... И для этого мне нужна пользовательская функция добавления.
Так почему же такая плохая практика создает пользовательские классы коллекций? Почему я не должен просто наследовать CollectionBase или DictionaryBase?
Я должен добавить, что я передаю этот код из VBA [пожалуйста, не стреляйте в меня:)], и там я должен был реализовать пользовательские коллекции.
Ответы
Ответ 1
Вместо того, чтобы RouteLinks
быть типом коллекции, простым решением было бы просто определить другой класс, скажем RouteLinksRepository
. Этот класс будет содержать функции List<RouteLink>
и AddRoute(RouteLink)
, а также любую другую пользовательскую логику для взаимодействия с этой коллекцией объектов RouteLink
. Тогда ваш класс обслуживания просто будет содержать экземпляр этого класса репозитория.
public class Service
{
public RouteLinksRepository RL; // A collection of RouteLink types
// ...
}
public class RouteLinksRepository
{
public List<RouteLink> RouteLinks;
public bool AddRoute(RouteLink linkToAdd)
{
//Custom logic on whether or not to add link
}
//Your other logic for the class
}
public class RouteLink
{
public string FirstStopRef;
public string LastStopRef;
public Tracks RouteTrack; // Another collection, this time of Track types
}
Ответ 2
Если требуется только проверка двойных записей, HashSet будет выполнять (реализовать GetHash и Equals). Однако, я думаю, вы пытаетесь сохранить маршрут. У маршрута есть заказ, что означает, что у вас есть заказ, а List < > гарантирует порядок. Сделайте объекты коллекции частными, чтобы скрыть реализацию.
public class Service
{
private List<RouteLink> RL; // A collection of RouteLink types
...
}
public class RouteLink
{
public string FirstStopRef;
public string LastStopRef;
private List<Track> Tracks; // Another collection, this time of Track types
}