就像SortedDictionary和Dictionary一样

时间:2021-11-08 06:53:18

C#集体类型( Collections in C#)

  调集是.NET FCL(Framework Class Library)中很重要的一部分,也是我们开发傍边最常用到的成果之一,几乎是无处不在。俗话说知其然,知其所以然,泛泛看到IEnumerable,IEnumerator,ICollection是不是知道他们之间各自的区别?除了List和Dictionary以外,你还用过哪些其它的调集类?空话少说,今天我们就来看一些这些界说调集类的接口以及他们的实现。

调集接口

  先来看一下,FCL为我们供给了哪些接口:

就像SortedDictionary和Dictionary一样

  

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。

就像SortedDictionary和Dictionary一样

  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多撑持一些成果,不只仅只供给根基的遍历成果,还包孕:

统计调集和元素个数

获取元素的下标

判断是否存在

添加元素到未尾

移除元素等等。。。