ToB企服应用市场:ToB评测及商务社交产业平台
标题:
C#.Net筑基-集合知识全解
[打印本页]
作者:
水军大提督
时间:
2024-6-20 10:15
标题:
C#.Net筑基-集合知识全解
01、集合底子知识
.Net 中提供了一系列的管理对象集合的范例,数组、可变列表、字典等。从范例安全上集合分为两类,
泛型集合
和
非泛型集合
,传统的非泛型集合存储为Object,需要范例转。而泛型集合提供了更好的性能、编译时范例安全,推荐利用。
.Net中集合主要集中在下面几个命名空间中:
1.1、集合的劈头:接口关系
集合接口
特点/阐明
IEnumerator、IEnumerator罗列器(还不是集合),提供foreach罗列项的能力IEnumerable、IEnumerable可罗列集合,几乎所有集合都实现了该接口,属于集合最底子的接口。就一个IEnumerator GetEnumerator() 方法,返回一个罗列器。ICollection、ICollection提供了底子集合操作:Count、Add()、Remove()、Clear()、Contains()、CopyTo()IList、IList索引器[int index]、IndexOf()、Insert()、RemoveAt()IDictionary、IDictionary键值集合操作:Keys、Values、索引器[Key]、Add()、Remove()IReadOnly***只读的集合,包括IReadOnlyCollection、IReadOnlyList、IReadOnlyDictionary等
天赋技能 —— foreach
:几乎所有集合都可以用foreach循环操作,是由于他们都继承自IEnumerable接口,由罗列器(IEnumerator)提供罗列操作。
几乎所有集合都提供添加、删除、计数,来自底子接口 ICollection、ICollection。
IList、IList 提供了数组的索引器、查找、插入等操作,几乎所有详细的集合范例都实现了该接口。
Array 是一个抽象类,是所有数组T[]的基类,她是范例安全的。
推荐尽量利用数组T[]、泛型版的集合,提供了更好的范例安全和性能。
1.2、非泛型集合—— 另有什么存在的代价?
非泛型的Hashtable,Key、Value都是Object范例的,Dictionary 是泛型版本的 Hashtable。
ArrayList 是非泛型版本的 List,基本很少利用,也尽量不用。
❓既然非泛型版本范例不安全,性能还差,为什么还存在呢?
主要是历史原因,泛型是.Net2.0 引入的,因此为了向后兼容,依然保留的非泛型版本集合。在接口实现时,非泛型接口一般都是显示实现的,因此基本不会用到。不过在有些场景下,非泛型接口、集合还是有点用的,如范例不固定的集合,大概用接口作为束缚条件或范例判定。
ArrayList arr = new ArrayList();
arr.Add(1);
arr.Add("sam");
arr.Add(new Point());
if (arr is IList) {}
class User<T> where T :IList {}
复制代码
1.3、Collection、List有何不同?
❓两者比较相似,他们到底有什么区别呢?该如何选择?
Collection 作为
自定义集合基类
,内部提供了一些virtual的实现,便于继承实现自己的集合范例。其内部集合用的就是List,如下部分源码 Collection.cs。
List 作为
集合
利用,是最常用的可变长集合范例了,他优化了性能,但是丢失了可扩展性,没有提供任何可以override的成员。
public class Collection<T>
{
public Collection()
{
items = new List<T>();
}
protected virtual void InsertItem(int index, T item)
{
items.Insert(index, item);
}
}
复制代码
02、罗列器——foreach的秘密!
foreach 用来循环迭代可罗列对象,用一种非常简洁、优雅的姿势访问可罗列元素。常用于数组、集合,当然不仅限于集合,只要符合要求罗列要求的都可以。
foreach 可罗列范例
阐明
数组包括Array数组、List、字典等,他们都实现了IEnumerable接口的。IEnumerable可罗列接口IEnumerable同上,泛型版本GetEnumerator()方法包含公共方法“IEnumerator GetEnumerator();”的任意范例
yield迭代器
yield语句实现的迭代器,实际返回的也是IEnumerable、IEnumerator
2.1、IEnumerator罗列器
罗列可以foreach 罗列的密码是他们都继承自IEnumerable接口,而更重要的是其内部的罗列器 —— IEnumerator。罗列器IEnumerator定义了
向前遍历
集合元素的基本协议,其申明如下:
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset(); //这个方法是非必须的,用于重置游标,可不实现
}
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
new T Current { get; }
}
复制代码
MoveNext() 移动当前元素到下一个位置,Current获取当前元素,假如没有元素了,则MoveNext()返回false。注意MoveNext()会先调用,因此首次MoveNext()是把位置移动到第一个位置。
Reset()用于重置到出发点,主要用于COM互操作,利用很少,可不用实现(直接抛出 NotSupportedException)。
<blockquote>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4