C#集体类型( Collections in C#)
调集是.NET FCL(Framework Class Library)中很重要的一部分,也是我们开发傍边最常用到的成果之一,几乎是无处不在。俗话说知其然,知其所以然,泛泛看到IEnumerable,IEnumerator,ICollection是不是知道他们之间各自的区别?除了List和Dictionary以外,你还用过哪些其它的调集类?空话少说,今天我们就来看一些这些界说调集类的接口以及他们的实现。
调集接口先来看一下,FCL为我们供给了哪些接口:
IEnumerable 和IEnumberator
1 2 3 4 5 6 7
public interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); }
IEnumerator界说了我们遍历调集的根基要领,以便我们可以实现单向向前的访谒调集中的每一个元素。而IEnumerable只有一个要领GetEnumerator即得到遍历器。
1 2 3 4
public interface IEnumerable { IEnumerator GetEnumerator(); }
注意:我们经常用的foreach便是一种语法糖,实际上还是挪用Enumerator里面的Current和MoveNext实现的遍历成果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
List<string> list = new List<string>() { "Jesse", "Chloe", "Lei", "Jim", "XiaoJun" }; // Iterate the list by using foreach foreach (var buddy in list) { Console.WriteLine(buddy); } // Iterate the list by using enumerator List<string>.Enumerator enumerator = list.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }
上面的代码顶用到的foreach和enumerator到IL中最后城市被翻译成enumerator的MoveNext和Current。
IEnumerable是一个很有用的接口,实现它的好处包孕:
撑持foreach语句
作为一个标准的调集类与其它类库进行交互
满足更庞大的调集接口的需求
撑持调集初始化器
固然实现的要领也有很多,如下:
如果我们调集是通过封装其它调集类而来的,那么我们可以直接返回这个调集的enumerator
通过yield return 来返回
实现我们本身的IEnumerator来实现
这里给大家演示一下如何通过yield来实现返回enumerator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
public class BuddyList : IEnumerable { private string[] data= new string[] { "Jesse", "Chloe", "Lei", "Jim", "XiaoJun" }; public IEnumerator GetEnumerator() { foreach (var str in data) { yield return str; } } } var myBuddies= new BuddyList(); foreach (var str in myBuddies) { Console.WriteLine(str); }
ICollection<T>和ICollection
从最上面第一张图我们可以知道,ICollection是直接担任自IEnumerable。而实际上也是如此,我们可以说ICollection比IEnumerable多撑持一些成果,不只仅只供给根基的遍历成果,还包孕:
统计调集和元素个数
获取元素的下标
判断是否存在
添加元素到未尾
移除元素等等。。。