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