C#收集类-是或否

C#收集类-是或否,c#,class,collections,C#,Class,Collections,虽然我是一名称职的程序员,但我对C#还是一个相对的新手,我承认我完全不知道编写自定义集合类是否是一个好主意。很多人似乎都说“不要”,但在C#中却有一整套用于此的基类 这是我的具体情况。我有一份时间表申请表。作为其中的一部分,我有一个服务类,服务类包含service-y的集合,比如路由链接。路由链接本身是一个自定义类: public class Service { public RouteLinks RL; // A collection of RouteLink types ...

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

这是我的具体情况。我有一份时间表申请表。作为其中的一部分,我有一个服务类,服务类包含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
}
到目前为止,我一直在考虑使用Dictionary作为RouteLink的类型,因为我需要能够引用它们。原则上这是好的。但是,将RouteLink添加到RouteLink集合的过程涉及检查它是否已经存在,或者它是否扩展和现有路由链接,或者。。。为此,我需要一个自定义的Add函数

那么,为什么创建自定义集合类的做法如此糟糕呢?为什么我不能继承CollectionBase或DictionaryBase


我可能应该补充一下,我正在从VBA传输此代码[请不要开枪打死我:)],在那里我必须实现自定义集合

如果只需要检查双条目,HashSet就可以(实现GetHash和Equals)。不过我想你是在试图保留一条路线。一条路线有一个订单,这意味着你有一个订单,列表保证订单。将集合对象设为私有以隐藏实现

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
}
公共类服务
{
private List RL;//RouteLink类型的集合
...
}
公共类航线
{
公共字符串FirstStopRef;
公共字符串LastStopRef;
私有列表曲目;//另一个集合,这次是曲目类型
}

与其将
RouteLinks
作为集合类型,一个简单的解决方案是只定义另一个类,比如说
RouteLinksRepository
。此类将包含一个
列表
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
}
公共类服务
{
公共RouteLink存储库RL;//RouteLink类型的集合
// ...
}
公共类路由资源库
{
公共列表线路;
公共bool AddRoute(RouteLink linkToAdd)
{
//是否添加链接的自定义逻辑
}
//你对这门课的其他逻辑
}
公共类航线
{
公共字符串FirstStopRef;
公共字符串LastStopRef;
public Tracks RouteTrack;//另一个集合,这次是轨道类型
}

我通常不会创建自定义集合,但我可以理解您的观点,并希望看到其他人对此的看法。也许是扩展方法?即使您选择实现集合,也不要从头开始。我的第一次尝试是为字典编写一个扩展方法“MyAdd()”
那么为什么创建自定义集合类的做法如此糟糕呢?
就其本身而言,事实并非如此。这就是为什么它们没有密封。如果您从集合类继承来实现业务对象,而不是(可能改进的)机制,那么这是唯一一种不好的做法。特别是埃里克·利珀特的回答。“机制和业务对象之间的区别很明确。@KonradMorawski,哦,是的,我记得这篇文章。很好。这不仅仅是检查两个条目——我对这个问题做了很大的简化。但是,谢谢,我必须阅读更多关于HashSet的内容,因为我可以看到它在其他用例中可能会很有用。@StuartR143请记住,实现自己的集合类可能会很棘手。有几个重要的注意事项需要牢记,比如线程安全。有一个丰富的开源.NET项目生态系统,因此,如果您需要一些标准.NET库没有提供的增强功能,我会先看看现成的选项,比如在推出我自己的解决方案之前。@KonradMorawski谢谢-另一个有趣的链接。考虑到我在我的专栏文章中读到的你链接到的文章,我认为我正在寻找相当标准的集合,我最需要做的是为特定需求提供一个定制的添加方法。因此,借用您的术语,我正在编写业务对象,而不是机制。有很多非常有用的指针需要考虑。“是根据实现的”。回答得好。