IEnumerable、IEnumerator、ICollection、IList、List的繼承關係及簡單使用

IEnumerable和IEnumerable<T>接口在.NET中是很是重要的接口,它容許開發人員定義foreach語句功能的實現並支持非泛型方法的簡單的迭代,IEnumerable和IEnumerable<T>接口是.NET Framework中最基本的集合訪問器。它定義了一組擴展方法,用來對數據集合中的元素進行遍歷、過濾、排序、搜索等操做。html

IEnumerable接口是很是的簡單,只包含一個抽象的方法GetEnumerator(),它返回一個可用於循環訪問集合的IEnumerator對象。IEnumerator對象有什麼呢?它是一個真正的集合訪器,沒有它,就不能使用foreach語句遍歷集合或數組,由於只有IEnumerator對象才能訪問集合中的項,假如連集合中的項都訪問不了,那麼進行集合的循環遍歷是不可能的事情了。數組

一、IEnumerator接口函數

提供在普通集合中遍歷的接口,有Current,MoveNext(),Reset(),其中Current返回的是object類型。spa

IEnumerator<T>:繼承自IEnumerator,有Current屬性,返回的是T類型。.net

1     public interface IEnumerator 2  { 3       bool MoveNext(); //將遊標的內部位置向前移動
4       object Current{get;} //獲取當前的項(只讀屬性)
5       void Reset(); //將遊標重置到第一個成員前面
6     }

二、IEnumerable接口指針

暴露一個IEnumerator,支持在普通集合中的遍歷。code

IEnumerable<T>:繼承自IEnumerable,暴露一個IEnumerator<T>,支持在泛型集合中遍歷。htm

 1     // 摘要:  2     // 公開枚舉器,該枚舉器支持在指定類型的集合上進行簡單迭代。  3     //
 4     // 類型參數:  5     // T:  6     // 要枚舉的對象的類型。
 7     [TypeDependency("System.SZArrayHelper")]  8     public interface IEnumerable<out T> : IEnumerable  9  { 10         // 摘要: 11         // 返回一個循環訪問集合的枚舉器。 12         //
13         // 返回結果: 14         // 可用於循環訪問集合的 System.Collections.Generic.IEnumerator<T>。
15         IEnumerator<T> GetEnumerator(); 16     }

能夠看到,GetEnumerator方法返回對另外一個接口System.Collections.IEnumerator的引用。這個接口提供了基礎設施,調用方能夠用來移動IEnumerable兼容容器包含的內部對象。對象

三、ICollection接口blog

同時繼承IEnumerable<T>和IEnumerable兩個接口

1     // 摘要: 2     // 定義操做泛型集合的方法。 3     //
4     // 類型參數: 5     // T: 6     // 集合中元素的類型。
7     [TypeDependency("System.SZArrayHelper")] 8     public interface ICollection<T> : IEnumerable<T>, IEnumerable

四、IList接口

1     public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

五、List的定義

1     public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

實現IEnumerable接口

 1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Collections;  6 namespace IEnumeratorSample  7 {  8     class Person : IEnumerable  9  { 10         public string Name;//定義Person的名字
11         public string Age;//定義Person的年齡
12 
13         public Person(string name, string age)//爲Person初始化(構造函數)
14  { 15             Name = name; 16             Age = age; 17  } 18 
19         private Person[] per; 20 
21         public Person(Person[] array)//重載構造函數,迭代對象
22  { 23             per = new Person[array.Length];//建立對象
24             for (int i = 0; i < array.Length; i++)//遍歷初始化對象
25  { 26                 per[i] = array[i];//數組賦值
27  } 28  } 29 
30         public IEnumerator GetEnumerator()//實現接口
31  { 32             return new PersonEnum(per); 33  } 34  } 35 
36     class PersonEnum : IEnumerator//實現foreach語句內部,並派生
37  { 38         public Person[] _per;//實現數組
39         int position = -1;//設置「指針」
40 
41         public PersonEnum(Person[] list) 42  { 43             _per = list;//實現list
44  } 45 
46         public bool MoveNext()//實現向前移動
47  { 48             position++;//位置增長
49             return (position < _per.Length);//返回布爾值
50  } 51 
52         public void Reset()//位置重置
53  { 54             position = -1;//重置指針爲-1
55  } 56 
57         public object Current//實現接口方法
58  { 59             get
60  { 61                 try
62  { 63                     return _per[position];//返回對象
64  } 65                 catch (IndexOutOfRangeException)//捕獲異常
66  { 67                     throw new InvalidOperationException();//拋出異常信息
68  } 69  } 70  } 71  } 72 
73     class Program 74  { 75         static void Main(string[] args) 76  { 77             Person[] per = new Person[2] 78  { 79                 new Person("Jack","21"), 80                 new Person("David","24"), 81  }; 82             Person personlist = new Person(per); 83             //遍歷對象
84             foreach (Person p in personlist) 85  { 86                 Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age); 87  } 88  Console.ReadKey(); 89  } 90  } 91 }

原文連接:http://www.studyofnet.com/news/452.html

相關博客1:http://blog.csdn.net/callmeback/article/details/8295648

相關博客2:http://www.cnblogs.com/shaosks/archive/2011/09/27/2193270.html

相關文章
相關標籤/搜索