我是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传输此代码[请不要拍我:)]并且我必须实现自定义集合。
答案 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
}