IEnumerator 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
支援非泛型集合上的簡單反覆專案。
public interface class IEnumerator
public interface IEnumerator
[System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
[System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IEnumerator
type IEnumerator = interface
[<System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")>]
type IEnumerator = interface
[<System.Runtime.InteropServices.Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type IEnumerator = interface
Public Interface IEnumerator
- 衍生
- 屬性
範例
以下程式碼範例展示了自訂集合中 IEnumerable 和 IEnumerator 介面的實作。 在此範例中,這些介面的成員並未被明確呼叫,但它們實作以支援在 Visualforeach Basic 中以for each遍歷集合。
using System;
using System.Collections;
// Simple business object.
public class Person
{
public Person(string fName, string lName)
{
this.firstName = fName;
this.lastName = lName;
}
public string firstName;
public string lastName;
}
// Collection of Person objects. This class
// implements IEnumerable so that it can be used
// with ForEach syntax.
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];
}
}
// Implementation for the GetEnumerator method.
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator) GetEnumerator();
}
public PeopleEnum GetEnumerator()
{
return new PeopleEnum(_people);
}
}
// When you implement IEnumerable, you must also implement 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;
}
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
*
*/
Imports System.Collections
' Simple business object.
Public Class Person
Public Sub New(ByVal fName As String, ByVal lName As String)
Me.firstName = fName
Me.lastName = lName
End Sub
Public firstName As String
Public lastName As String
End Class
' Collection of Person objects, which implements IEnumerable so that
' it can be used with ForEach syntax.
Public Class People
Implements IEnumerable
Private _people() As Person
Public Sub New(ByVal pArray() As Person)
_people = New Person(pArray.Length - 1) {}
Dim i As Integer
For i = 0 To pArray.Length - 1
_people(i) = pArray(i)
Next i
End Sub
' Implementation of GetEnumerator.
Public Function GetEnumerator() As IEnumerator _
Implements IEnumerable.GetEnumerator
Return New PeopleEnum(_people)
End Function
End Class
' When you implement IEnumerable, you must also implement IEnumerator.
Public Class PeopleEnum
Implements IEnumerator
Public _people() As Person
' Enumerators are positioned before the first element
' until the first MoveNext() call.
Dim position As Integer = -1
Public Sub New(ByVal list() As Person)
_people = list
End Sub
Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
position = position + 1
Return (position < _people.Length)
End Function
Public Sub Reset() Implements IEnumerator.Reset
position = -1
End Sub
Public ReadOnly Property Current() As Object Implements IEnumerator.Current
Get
Try
Return _people(position)
Catch ex As IndexOutOfRangeException
Throw New InvalidOperationException()
End Try
End Get
End Property
End Class
Class App
Shared Sub Main()
Dim peopleArray() As Person = { _
New Person("John", "Smith"), _
New Person("Jim", "Johnson"), _
New Person("Sue", "Rabon")}
Dim peopleList As New People(peopleArray)
Dim p As Person
For Each p In peopleList
Console.WriteLine(p.firstName + " " + p.lastName)
Next
End Sub
End Class
' This code produces output similar to the following:
'
' John Smith
' Jim Johnson
' Sue Rabon
備註
IEnumerator 是所有非通用列舉器的基礎介面。 它的通用對應物是 System.Collections.Generic.IEnumerator<T> 介面。
foreach C# 語言(for each在 Visual Basic 中)的陳述隱藏了列舉器的複雜度。 因此,建議使用 foreach 而非直接操作普查器。
列舉值可用來讀取集合中的數據,但無法用來修改基礎集合。
此 Reset 方法旨在實現 COM 互通性,且不必完全實作;實作者可以拋出 NotSupportedException。
一開始,列舉值會放在集合中的第一個專案之前。 你必須呼叫 MoveNext 方法將列舉子推進到集合的第一個元素,才能讀取 Current;否則 Current 是未定義的。
Current 回傳相同物件,直到被呼叫其中一 MoveNext 或 Reset 。 MoveNext 設定 Current 為下一個元素。
若 MoveNext 通過集合的末尾,列舉器會位於集合的最後一個元素之後,並 MoveNext 返回 false。 當列舉器處於此位置時,後續呼叫 MoveNext 也返回 false。 若最後一次呼叫 MoveNext 回傳 false, Current 則為未定義。
若要再次設定 Current 為集合的第一個元素,你可以呼叫 Reset,如果有實作,接 MoveNext著 。 如果 Reset 沒有實作,你必須建立一個新的列舉器實例,才能回到集合的第一個元素。
如果對集合進行變更,例如新增、修改或刪除專案,列舉值的行為是未定義的。
列舉值沒有集合的獨佔存取權;因此,透過集合列舉本質上不是安全線程的程式。 即使集合同步處理,其他線程仍然可以修改集合,這會導致列舉值擲回例外狀況。 若要保證列舉期間的線程安全性,您可以在整個列舉期間鎖定集合,或攔截其他線程所做的變更所產生的例外狀況。
屬性
| 名稱 | Description |
|---|---|
| Current |
取得集合中位於列舉值目前位置的專案。 |
方法
| 名稱 | Description |
|---|---|
| MoveNext() |
將列舉值前進至集合的下一個專案。 |
| Reset() |
將列舉值設定為其初始位置,也就是集合中第一個專案之前。 |