C#中IEnumerable接口用法實(shí)例分析
本文實(shí)例講述了C#中IEnumerable接口用法。分享給大家供大家參考。具體分析如下:
枚舉數(shù)可用于讀取集合中的數(shù)據(jù),但不能用于修改基礎(chǔ)集合。
最初,枚舉數(shù)定位在集合中第一個(gè)元素前。Reset 方法還會(huì)將枚舉數(shù)返回到此位置。在此位置上,Current 屬性未定義。因此,在讀取 Current 的值之前,必須調(diào)用 MoveNext 方法將枚舉數(shù)提前到集合的第一個(gè)元素。
在調(diào)用 MoveNext 或 Reset 之前,Current 返回同一對(duì)象。MoveNext 將 Current 設(shè)置為下一個(gè)元素。
如果 MoveNext 越過(guò)集合的末尾,枚舉數(shù)就會(huì)被放置在此集合中最后一個(gè)元素的后面,且 MoveNext 返回 false。當(dāng)枚舉數(shù)位于此位置時(shí),對(duì) MoveNext 的后續(xù)調(diào)用也返回 false。如果對(duì) MoveNext 的最后一次調(diào)用返回 false,則 Current 為未定義。若要再次將 Current 設(shè)置為集合的第一個(gè)元素,可以調(diào)用 Reset,然后再調(diào)用 MoveNext。
只要集合保持不變,枚舉數(shù)就保持有效。如果對(duì)集合進(jìn)行更改(如添加、修改或刪除元素),則枚舉數(shù)將失效且不可恢復(fù),而且其行為是不確定的。
枚舉數(shù)沒(méi)有對(duì)集合的獨(dú)占訪問(wèn)權(quán);因此,從頭到尾對(duì)一個(gè)集合進(jìn)行枚舉在本質(zhì)上不是一個(gè)線程安全的過(guò)程。若要確保枚舉過(guò)程中的線程安全,可以在整個(gè)枚舉過(guò)程中鎖定集合。若要允許多個(gè)線程訪問(wèn)集合以進(jìn)行讀寫(xiě)操作,則必須實(shí)現(xiàn)自己的同步。
下面的代碼示例演示如何實(shí)現(xiàn)自定義集合的 IEnumerable 接口。在此示例中,沒(méi)有顯式調(diào)用但實(shí)現(xiàn)了 GetEnumerator,以便支持使用 foreach(在 Visual Basic 中為 For Each)。此代碼示例摘自 IEnumerable 接口的一個(gè)更大的示例。
using System; using System.Collections; public class Person { public Person(string fName, string lName) { this.firstName = fName; this.lastName = lName; } public string firstName; public string lastName; } public class People : IEnumerable { private Person[] _people; public People(Person[] pArray) { _people = new Person[pArray.Length]; for (int i = 0; i < pArray.Length; i++) { _people[i] = pArray[i]; } } IEnumerator IEnumerable.GetEnumerator() { return (IEnumerator) GetEnumerator(); } public PeopleEnum GetEnumerator() { return new PeopleEnum(_people); } } public class PeopleEnum : IEnumerator { public Person[] _people; // Enumerators are positioned before the first element // until the first MoveNext() call. int position = -1; public PeopleEnum(Person[] list) { _people = list; } public bool MoveNext() { position++; return (position < _people.Length); } public void Reset() { position = -1; } object IEnumerator.Current { get { return Current; } } public Person Current { get { try { return _people[position]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } } class App { static void Main() { Person[] peopleArray = new Person[3] { new Person("John", "Smith"), new Person("Jim", "Johnson"), new Person("Sue", "Rabon"), }; People peopleList = new People(peopleArray); foreach (Person p in peopleList) Console.WriteLine(p.firstName + " " + p.lastName); } } /* This code produces output similar to the following: * * John Smith * Jim Johnson * Sue Rabon * */
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- C#中IEnumerable、ICollection、IList、List之間的區(qū)別
- C# IQueryable及IEnumerable區(qū)別解析
- C# IEnumerable和IEnumerator接口淺析
- C#中IEnumerable、ICollection、IList、List之間的區(qū)別
- C#中的IEnumerable簡(jiǎn)介及簡(jiǎn)單實(shí)現(xiàn)實(shí)例
- C#中的IEnumerable接口深入研究
- 基于C#中IDisposable與IEnumerable、IEnumerator的應(yīng)用
- C#中IEnumerable接口介紹并實(shí)現(xiàn)自定義集合
相關(guān)文章
C#使用Equals()方法比較兩個(gè)對(duì)象是否相等的方法
這篇文章主要介紹了C#使用Equals()方法比較兩個(gè)對(duì)象是否相等的方法,涉及C#操作對(duì)象的相關(guān)技巧,需要的朋友可以參考下2015-04-04c#自定義Attribute獲取接口實(shí)現(xiàn)示例代碼
這篇文章主要給大家介紹了關(guān)于c#自定義Attribute獲取接口實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09使用C#寫(xiě)了一個(gè)可以推算火車票身份證號(hào)碼的小程序
這篇文章主要介紹了使用C#寫(xiě)了一個(gè)可以推算火車票身份證號(hào)碼的小程序 的相關(guān)資料,需要的朋友可以參考下2016-02-02C#同步網(wǎng)絡(luò)時(shí)間的方法實(shí)例詳解
這篇文章主要介紹了C#同步網(wǎng)絡(luò)時(shí)間的方法,以實(shí)例形式較為詳細(xì)的分析了C#獲取網(wǎng)絡(luò)時(shí)間與同步本機(jī)系統(tǒng)時(shí)間的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05C# 中 System.Index 結(jié)構(gòu)體和 Hat 運(yùn)算符(^)的使用示例
這篇文章主要介紹了C# 中 System.Index 結(jié)構(gòu)體和 Hat 運(yùn)算符(^)的使用示例,幫助大家更好的理解和使用C#,感興趣的朋友可以了解下2020-09-09C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法
這篇文章主要介紹了C#實(shí)現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了C#字符數(shù)組轉(zhuǎn)字符串及字符串轉(zhuǎn)字符數(shù)組的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02兩路歸并的數(shù)組與鏈表的實(shí)現(xiàn)方法
本篇文章對(duì)兩路歸并的數(shù)組與鏈表的實(shí)現(xiàn)方法進(jìn)行了分析介紹。需要的朋友參考下2013-05-05C#編寫(xiě)一個(gè)網(wǎng)游客戶端的完整步驟
這篇文章主要給大家介紹了關(guān)于C#編寫(xiě)一個(gè)網(wǎng)游客戶端的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11C#實(shí)現(xiàn)將字符串轉(zhuǎn)化為日期格式的方法詳解
這篇文章主要為大家詳細(xì)介紹了C#如何使用DateTime結(jié)構(gòu)的ParseExact方法和Parse方法分別將字符串轉(zhuǎn)化為日期格式,有需要的小伙伴可以了解一下2024-01-01