溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何實(shí)現(xiàn)IEnumerator接口分析

發(fā)布時(shí)間:2022-01-07 21:37:55 來(lái)源:億速云 閱讀:147 作者:柒染 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何實(shí)現(xiàn)IEnumerator接口分析,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

/*語(yǔ)法:(C#)*/
[ComVisibleAttribute(true)] 
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")] 
public interface IEnumerator

 備注:

/*
     IEnumerator 是所有非泛型枚舉數(shù)的基接口。
     C# 語(yǔ)言的 foreach 語(yǔ)句(在 Visual Basic 中為 for each)隱藏了枚舉數(shù)的復(fù)雜性。因此,建議  foreach,而不直接操作枚舉數(shù)。枚舉數(shù)可用于讀取集合中的數(shù)據(jù),但不能用于修改基礎(chǔ)集。
     
    最初,枚舉數(shù)定位在集合中第一個(gè)元素前。Reset 方法還會(huì)將枚舉數(shù)返回到此位置。在此位置,調(diào)用 Current 屬性會(huì)引發(fā)異常。因此,在讀取 Current 的值之前,必須調(diào)用MoveNext 方法將枚舉數(shù)提前到集合的第一個(gè)元素。在調(diào)用 MoveNext 或 Reset 之前,Current 返回同一對(duì)象。MoveNext 將 Current 設(shè)置為下一個(gè)元素。
    
    如果 MoveNext 越過(guò)集合的末尾,則枚舉數(shù)將被放置在此集合中最后一個(gè)元素的后面,而且 MoveNext 返回 false。當(dāng)枚舉數(shù)位于此位置時(shí),對(duì) MoveNext 的后續(xù)調(diào)用也返回 false。如果最后一次調(diào)用 MoveNext 返回 false,則調(diào)用 Current 會(huì)引發(fā)異常。若要再次將 Current 設(shè)置為集合的第一個(gè)元素,可以調(diào)用 Reset,然后再調(diào)用MoveNext。
    
     只要集合保持不變,枚舉數(shù)就保持有效。如果對(duì)集合進(jìn)行了更改(如添加、修改或刪除元素),則枚舉數(shù)將失效且不可恢復(fù),并且下一次對(duì) MoveNext 或 Reset 的調(diào)用將引發(fā)InvalidOperationException。如果在 MoveNext 和 Current 之間修改集合,那么即使枚舉數(shù)已經(jīng)無(wú)效,Current 也將返回它所設(shè)置成的元素。
     
     枚舉數(shù)沒(méi)有對(duì)集合的獨(dú)占訪(fǎng)問(wèn)權(quán);因此,枚舉通過(guò)集合在本質(zhì)上不是一個(gè)線(xiàn)程安全的過(guò)程。即使一個(gè)集合已進(jìn)行同步,其他線(xiàn)程仍可以修改該集合,這將導(dǎo)致枚舉數(shù)引發(fā)異常。若要在枚舉過(guò)程中保證線(xiàn)程安全,可以在整個(gè)枚舉過(guò)程中鎖定集合,或者捕捉由于其他線(xiàn)程進(jìn)行的更改而引發(fā)的異常。
 */

樣例:

using System;
using System.Collections;
//person類(lèi)
public class Person
{    public Person(string fName, string lName)
    {        
        this.firstName = fName;
        this.lastName = lName;
    }    
    public string firstName;
    public string lastName;
}

//People類(lèi),實(shí)現(xiàn)IEnumerable
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];
        }
    }    
    public IEnumerator GetEnumerator()
    { 
           return new PeopleEnum(_people);
    }
}

//實(shí)現(xiàn)IEnumerator
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;
    }
     public object Current
    {        
        get
        {            
            try
            { 
                           return _people[position];
            }catch (IndexOutOfRangeException)
            {
                            throw new InvalidOperationException();
            }
        }
    }
}

//app
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
 * 
 */

上述就是小編為大家分享的如何實(shí)現(xiàn)IEnumerator接口分析了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI