上课时收藏

Bru*_*sta 7 c# collections

当一个类必须具有某种对象的容器(集合)时,有几种选择,我想知道我会更喜欢哪种实现。

这里遵循我发现的选项:

public class AClass : IEnumerable<string>{
   private List<string> values = new List<string>()

   IEnumerator IEnumerable.GetEnumerator()
   {
      return GetEnumerator();
   }

   public IEnumerator<T> GetEnumerator(){
      return values.GetEnumerator();
   }
}
Run Code Online (Sandbox Code Playgroud)

优点:AClass不依赖于集合的具体实现(在这种情况下为List)。

缺点:AClass没有添加和删除元素的接口

public class AClass : ICollection<string>{
   private List<string> values = new List<string>()

   IEnumerator IEnumerable.GetEnumerator()
   {
      return GetEnumerator();
   }

   public IEnumerator<T> GetEnumerator(){
      return values.GetEnumerator();
   }

   //other ICollectionMembers
}
Run Code Online (Sandbox Code Playgroud)

优点:与IEnumerable相同,并且具有用于添加和删除元素的界面

缺点:ICollection接口定义了其他人很少使用的方法,仅出于接口的目的而实现这些方法就很无聊。IEnumerable LINQ扩展也可以解决其中一些问题。

public class AClass : List<string>{

}
Run Code Online (Sandbox Code Playgroud)

优点:无需执行任何方法。调用方可以调用List实现的任何方法

缺点:AClass依赖于集合列表,如果更改,则可能需要更改某些调用者代码。同样,AClass不能继承任何其他类。

问题是:我更愿意声明我的班级包含一个同时支持添加和删除操作的集合?或其他建议...

Sel*_*enç 5

我的建议是只定义类的泛型列表里面,写更多的AddRemove方法,像这样和实现IEnumerable:

public class MyClass : IEnumerable
{
    private List<string> myList;

    public MyClass()
    {
        myList = new List<string>();
    }

    public void Add(string item)
    {
        if (item != null) myList.Add(item);
    }

    public void Remove(string item)
    {
        if (myList.IndexOf(item) > 0) myList.Remove(item);
    }

    public IEnumerable<string> MyList { get { return myList; } }

    public IEnumerator GetEnumerator()
    {
        return myList.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不想实现自己的集合,这是最好的方法。您不需要实现AddRemove方法的接口。我想像这样的附加方法适合您的需求。