C#集合类 - 是或否

时间:2014-03-10 10:14:53

标签: c# class collections

我是C#的新手,虽然我是一名称职的程序员,但我承认我对编写自定义集合类是否是一个好主意完全感到困惑。很多人似乎都说“不要”,但在C#中有一整套基类。

这是我的具体案例。我有一个时间表申请。作为其中的一部分,我有一个服务类,服务类包含服务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
}

到目前为止,我已经看过使用Dictionary作为RouteLinks的类型,因为我需要能够引用它们。原则上这很好。但是,将RouteLink添加到RouteLinks集合的过程包括检查它是否已经存在,或者它是否已扩展和现有的路由链接,或者......为此,我需要一个自定义的添加功能。

那么为什么创建自定义集合类会有这么糟糕的做法呢?为什么我不应该继承CollectionBase或DictionaryBase?

我或许应该补充一点,我正在从VBA传输此代码[请不要拍我:)]并且我必须实现自定义集合。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

如果唯一需要检查双重条目,HashSet将执行(实现GetHash和Equals)。但是我猜你想要保存一条路线。路线有一个订单,这意味着您有一个订单和List&lt;&gt;保证订单。将集合对象设为私有以隐藏实现。

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
}