С# Коллекционные классы - да или нет

Я относительный новичок на С#, хотя я компетентный программист, и я признаюсь, что я совершенно смущен относительно того, хорошо ли писать пользовательские коллекции. Так много людей, кажется, говорят "не надо", но для С# существует целый набор базовых классов.

Вот мой конкретный случай. У меня есть приложение для расписания. Как часть этого, у меня есть класс обслуживания, а класс службы содержит коллекции вещей 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
}