IEnumerable接口,其中只有一個返回IEnumerator類型的方法數組
public interface IEnumerable { IEnumerator GetEnumerator(); }
public interface IEnumerator {//獲取集合中的當前元素。 object Current { get; }//將枚舉數推動到集合的下一個元素。 bool MoveNext();//將枚舉數設置爲其初始位置,該位置位於集合中第一個元素以前。 void Reset(); }
一種類型的數據,若是想要經過foreach來進行迭代,那麼就必須實現IEnumerable接口。例如:ArrayList、Hashtable等都實現了它,才得以使用foreach來進行遍歷。學習
關係
IEnumerable
:ICollection
:IDictionary (實現是鍵/值對的集合:Hashtable,Dictionary)
:IList (實現是值的集合,其成員可經過索引訪問:ArrayList,Array)
:某些集合(如 Queue 類和 Stack 類)限制對其元素的訪問,它們直接實現 ICollection 接口。
----以上都在System.Collections命名空間中
ui
泛型
IEnumerable
:IEnumerable<T>
:ICollection<T>
:IDictionary<TKey, TValue> 實現是鍵/值對的集合,如 Dictionary<TKey, TValue> 類
:IList<T> IList<T> 實現是值的集合,而且能夠按索引訪問它的成員,如 List<T> 類
----以上泛型在System.Collections.Generic命名空間中
this
用實例說話:spa
定義一個類3d
class User { public User(string fName, string lName) { this.firstName = fName; this.lastName = lName; } public string firstName; public string lastName; }
運行1、code
static void Main(string[] args) { User[] user = new User[] { new User("John", "Smith"), new User("Jim", "Johnson"), new User("Sue", "Rabon"), }; foreach (User u in user) { Console.WriteLine(u.firstName); } Console.ReadKey(); }
//此處之因此能夠用foreach循環,是由於定義的類型實際上是一個數組類型,由於數組類型已經實現了IEnumerable接口,並對其進行了實現.
MSDN中的例子,其實就是對數組重寫了http://msdn.microsoft.com/zh-cn/library/vstudio/system.collections.ienumerable.aspx
運行2、xml
static void Main(string[] args) { User use = new User("dddd","ffff"); foreach (string s in use) { Console.WriteLine(s); } Console.ReadKey(); } //這裏會提示錯誤:User不包含GetEnumerator的公共定義,所以foreach語句不能做用與User類型的變量
補充1、由模型綁定中,綁定泛型類型時學習到泛型相關的知識!blog
//調用1
ExtraGenericInterface(typeof(List<User>),typeof(IEnumerable<>))
//調用2
ExtraGenericInterface(typeof(IEnumerable<User>),typeof(IEnumerable<>))
public Type ExtraGenericInterface(Type queryType, Type interfaceType) { //當前類型queryType是不是泛型 bool b = queryType.IsGenericType; //返回能夠構造當前泛型類型的一個泛型類型,即:由IEnumerable<User>獲得 IEnumerable<> Type tt = queryType.GetGenericTypeDefinition(); bool ttt = tt == interfaceType ? true : false; Func<Type, bool> predicate = t => t.IsGenericType && (t.GetGenericTypeDefinition() == interfaceType); //Func<Type, bool> predicate = delegate(Type queryType2){return false;}; //若是當前類型是泛型,而且該發行是由interfaceType類型構造的。 if (predicate(queryType)) { return queryType; } else { //獲取當前類實現的全部類和接口 Type[] types = queryType.GetInterfaces(); //在數組中找,並返回知足 predicate 條件的第一個元素 //也就是在全部父類或實現的接口中找到是泛型而且構造此泛型的類型是interfaceType類型的第一個元素
//FirstOrDefault<Type>中Type是後面委託predicate的參數類型 Type tttt = types.FirstOrDefault<Type>(predicate); return queryType.GetInterfaces().FirstOrDefault<Type>(predicate); } }