List(of T)和Collection(of T)之间有什么区别?
List
List
Collection
除非有List
以上只是建议。
值得注意的是,使用任何类型的可变对象来封装其自身状态的类型,应避免返回此类类型的对象,除非这些对象具有在被修改时向其所有者通知的方式,或者返回对象的方法的名称清楚地暗示它返回一个新实例。请注意,例如,一个Dictionary
根据《Framework Design Guidelines, Second Edition》的建议进行整理。
问题的出现的原因是因为在.NET中,有两种常用的集合类型:List (of T)和Collection(of T),它们之间有一些区别。
List (of T)是一个可变长度的有序集合,它继承自IList (of T)接口。List (of T)提供了一系列方法和属性,用于在集合中添加、删除、查找和排序元素。它是一个非抽象类,可以直接实例化使用。
Collection (of T)是一个可定制的包装类,它也继承自IList (of T)接口。与List (of T)不同的是,Collection (of T)提供了一些自定义的方法和事件,可以根据需要进行重写和扩展。它的方法默认委托给标准的IList (of T)方法,但可以很容易地进行重写,实现自定义的逻辑。而且,在Collection (of T)中还可以使用事件来处理集合的变化,这在IList中是无法实现的。
所以,问题的解决方法是使用Collection (of T)而不是List (of T)。因为Collection (of T)更容易扩展和定制,可以避免大量的重构工作。同时,使用Collection (of T)还可以实现多态,保证代码的兼容性,不会影响使用其他API的代码。另外,ObservableCollection (of T)是Collection (of T)的一个具体实现,它重写了一些方法以通知关于集合变化的事件。
总之,List (of T)和Collection (of T)在功能上有一些区别,选择使用哪个取决于具体的需求和情况。但从扩展性和灵活性的角度考虑,推荐使用Collection (of T)。
在C#中,有三个表示对象集合的概念。按特性递增的顺序,它们是:
- Enumerable(可枚举)- 无序,不可修改
- Collection(集合)- 可添加/删除项
- List(列表)- 允许项有顺序(可以通过索引访问和删除)
Enumerable没有顺序。不能向集合中添加或删除项。甚至不能获取集合中的项数。它严格地让你按顺序访问集合中的每一项。
Collection是可修改的集合。可以向集合中添加和删除对象,也可以获取集合中的项数。但仍然没有顺序,因此无法通过索引访问项,也无法排序。
List是有序的对象集合。可以对列表进行排序,通过索引访问项,通过索引删除项。
事实上,在查看这些接口时,它们是建立在彼此之上的。
当声明变量或方法参数时,应根据需要对对象集合使用IEnumerable、ICollection或IList。
如果只需要对列表中的每个对象执行某些操作,则只需要使用IEnumerable:
void SaveEveryUser(IEnumerableusers) { foreach (User u in users) { // ... } }
您不需要关心用户是保存在List、Collection、Array还是其他任何地方。您只需要IEnumerable接口。
如果需要能够添加、删除或计算集合中的项数,则使用Collection:
ICollectionusers = new Collection (); users.Add(new User());
如果关心排序顺序,并且需要顺序正确,则使用List:
IListusers = FetchUsers(db);
总结一下:
- Enumerable - 访问项,无序,不可修改
- Collection - 可修改(添加、删除、计数)
- List - 可以通过索引访问
根据需要选择相应的概念和类。