您的位置:首页 > 编程语言 > C#

C#学习小记(1) - 集合接口ICollection,IEnumerable,IEnumerator等的关系

2015-04-08 23:10 435 查看
这是博主看书的暂时的小记,未来有时间会整理成学习资料,目前仅供看着乐

今天看书看到泛型,泛型中用集合接口做了例子,就想顺便理一下集合的各种接口的意思

咱先假定已经知道什么是接口了,啊

注:以下大部分内容,只要在后面加一个< T > ,就可以泛型啦

C#中实现集合有很多办法,比如说数组,比如说ArrayList,比如说List

话说相比之下ArrayList和List比起来似乎一无是处,回头做个比较。

那么这么多办法还有一个就是自建一个集合类,是的,就和List一样,高大上。

那你想做这么个类,为了融入环境,人家List能做的,你也得能做,那就得实现他的接口了

那List的接口有……

[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>,
IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>,
IEnumerable


……喂这和说好的不一样啊

没事慢慢来

IEnumerable接口包含一个GetEnumerator()方法

GetEnumerator()返回一个IEnumerator,不懂的话,返回一个实现了IEnumerator接口的类,没错,就是迭代器

那这个类是什么

啊,你得自己写(掩面)

当然得符合规范,这个类得实现了IEnumerator接口

IEnumerator要求类实现了类似于c++中前向迭代器的功能,对,前向迭代器,他只能movenext或者reset。不过这对于foreach来说也足够了

那到你手里要怎么实现呢,看官方例子

// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
private BoxCollection _collection;
private int curIndex;
private Box curBox;

public BoxEnumerator(BoxCollection collection)
{
_collection = collection;
curIndex = -1;
curBox = default(Box);

}

public bool MoveNext()
{
//Avoids going beyond the end of the collection.
if (++curIndex >= _collection.Count)
{
return false;
}
else
{
// Set current box to next item in collection.
curBox = _collection[curIndex];
}
return true;
}

public void Reset() { curIndex = -1; }

void IDisposable.Dispose() { }

public Box Current
{
get { return curBox; }
}

object IEnumerator.Current
{
get { return Current; }
}

}


略看一下,可以先总结出来几点

1.Current属性返回当前指着的东西(没错,解引用)

2.MoveNext()让下一次调用Current的时候指着下一个东西

3.Reset()让一切从头开始

可以看到,在最初始的状态,直接用Current的话,索引在-1。

这意味着想要遍历,必须先MoveNext再Current

同时,MoveNext在移动到的下个位置可用时返回true

对了,我们可以在这里推测出foreach的工作原理:

while (a.MoveNext())

dosomething(a.Current)

当然这都是题外话。

对了还有一个IDisposable接口,这是非泛型版本没有的,不过暂时不用管

这就是IEnumerable和IEnumerator,总结一下就是

实现了IEnumerable的类,可以用foreach对其迭代

然而为了实现IEnumerable,你还得自建一个实现了IEnumerator的类作为迭代器。

现在来讲ICollection。它是对IEnumerable的扩展,增加了Add,Clear,Contain等方法。简单的来说就是功能更强。

IList则是ICollection的增强,则实现了按索引修改、查找等神奇功能,对,一层层加强下来功能基本上就是c++里头的vector了(只是说功能,具体效率、空间等和实现方法有关)

ICollection的增强还有个分支,就是IDictionary,要求实现键值对的查找,实现了他的就是Dictionary,这是啥,对,就是STL_map。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C#