IEnumerator<T> Rozhraní
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Podporuje jednoduchou iteraci v obecné kolekci.
generic <typename T>
public interface class IEnumerator : IDisposable, System::Collections::IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator
type IEnumerator<'T> = interface
interface IEnumerator
interface IDisposable
type IEnumerator<'T> = interface
interface IDisposable
interface IEnumerator
Public Interface IEnumerator(Of Out T)
Implements IDisposable, IEnumerator
Public Interface IEnumerator(Of T)
Implements IDisposable, IEnumerator
Parametry typu
- T
Typ objektů k výčtu.
Tento parametr typu je kovariantní. To znamená, že můžete použít buď zadaný typ, nebo libovolný typ, který je více odvozený. Další informace o kovarianci a kontravarianci najdete v tématu popisujícím kovarianci a kontravarianci u parametrického polymorfismu.- Odvozené
- Implementuje
Příklady
Následující příklad ukazuje implementaci IEnumerator<T> rozhraní pro kolekci třídy vlastních objektů. Vlastní objekt je instance typu Box
a třída kolekce je BoxCollection
. Tento příklad kódu je součástí většího příkladu ICollection<T> pro rozhraní.
// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
private BoxCollection _collection;
private int curIndex;
private Box curBox;
public BoxEnumerator(BoxCollection collection)
{
_collection = collection;
curIndex = -1;
curBox = default(Box);
}
public bool MoveNext()
{
//Avoids going beyond the end of the collection.
if (++curIndex >= _collection.Count)
{
return false;
}
else
{
// Set current box to next item in collection.
curBox = _collection[curIndex];
}
return true;
}
public void Reset() { curIndex = -1; }
void IDisposable.Dispose() { }
public Box Current
{
get { return curBox; }
}
object IEnumerator.Current
{
get { return Current; }
}
}
' Defines the enumerator for the Boxes collection.
' (Some prefer this class nested in the collection class.)
Public Class BoxEnumerator
Implements IEnumerator(Of Box)
Private _collection As BoxCollection
Private curIndex As Integer
Private curBox As Box
Public Sub New(ByVal collection As BoxCollection)
MyBase.New()
_collection = collection
curIndex = -1
curBox = Nothing
End Sub
Private Property Box As Box
Public Function MoveNext() As Boolean _
Implements IEnumerator(Of Box).MoveNext
curIndex = curIndex + 1
If curIndex = _collection.Count Then
' Avoids going beyond the end of the collection.
Return False
Else
'Set current box to next item in collection.
curBox = _collection(curIndex)
End If
Return True
End Function
Public Sub Reset() _
Implements IEnumerator(Of Box).Reset
curIndex = -1
End Sub
Public Sub Dispose() _
Implements IEnumerator(Of Box).Dispose
End Sub
Public ReadOnly Property Current() As Box _
Implements IEnumerator(Of Box).Current
Get
If curBox Is Nothing Then
Throw New InvalidOperationException()
End If
Return curBox
End Get
End Property
Private ReadOnly Property Current1() As Object _
Implements IEnumerator.Current
Get
Return Me.Current
End Get
End Property
End Class
' Defines two boxes as equal if they have the same dimensions.
Public Class BoxSameDimensions
Inherits EqualityComparer(Of Box)
Public Overrides Function Equals(ByVal b1 As Box, ByVal b2 As Box) As Boolean
If b1.Height = b2.Height And b1.Length = b2.Length And b1.Width = b2.Width Then
Return True
Else
Return False
End If
End Function
Public Overrides Function GetHashCode(ByVal bx As Box) As Integer
Dim hCode As Integer = bx.Height ^ bx.Length ^ bx.Width
Return hCode.GetHashCode()
End Function
End Class
Poznámky
IEnumerator<T> je základní rozhraní pro všechny obecné enumerátory.
Příkaz foreach
jazyka C# (for each
v jazyce C++, For Each
v jazyce Visual Basic) skrývá složitost enumerátorů. Proto se doporučuje používat foreach
místo přímé manipulace s enumerátorem.
Enumerátory lze používat ke čtení dat v kolekci, nikoli však k úpravě zdrojové kolekce.
Zpočátku je enumerátor umístěn před prvním prvkem v kolekci. Na této pozici Current není definován. Proto je nutné před čtením hodnoty Currentvolat MoveNext k posunu enumerátoru na první prvek kolekce.
Current vrátí stejný objekt, dokud MoveNext není volána. MoveNext nastaví Current na další prvek.
Pokud MoveNext projde konec kolekce, enumerátor se umístí za poslední prvek v kolekci a MoveNext vrátí false
. Když je enumerátor na této pozici, následné volání také MoveNext vrátí false
. Pokud je poslední volání MoveNext vráceno false
, Current není definováno. Nelze znovu nastavit Current na první prvek kolekce; místo toho musíte vytvořit novou instanci enumeratoru.
Metoda Reset je poskytována pro interoperabilitu modelu COM. Nemusí být nutně implementována; místo toho může implementátor jednoduše hodit NotSupportedException. Pokud se to ale rozhodnete udělat, měli byste se ujistit, že se na tuto funkci nespoléhají Reset žádní volající.
Pokud jsou v kolekci provedeny změny, například přidání, úprava nebo odstranění prvků, chování enumerátoru není definováno.
Enumerátor nemá výhradní přístup ke kolekci; proto výčet prostřednictvím kolekce není vnitřně procedurou bezpečnou pro přístup z více vláken. Chcete-li zajistit bezpečnost vláken během výčtu, můžete uzamknout kolekci během celého výčtu. Chcete-li více vláknům umožnit přístup ke kolekci pro čtení a zápis, musíte implementovat svou vlastní synchronizaci.
Výchozí implementace kolekcí v System.Collections.Generic oboru názvů nejsou synchronizovány.
Poznámky pro implementátory
Implementace tohoto rozhraní vyžaduje implementaci negenerického IEnumerator rozhraní. Metody MoveNext() a Reset() nezávisí na T
a zobrazují se pouze na negenerickém rozhraní. Vlastnost Current se zobrazí v obou rozhraních a má různé návratové typy. Implementujte negenerickou Current vlastnost jako explicitní implementaci rozhraní. To umožňuje každému příjemci negenerického rozhraní využívat obecné rozhraní.
Kromě toho IEnumerator<T> implementuje IDisposable, což vyžaduje, abyste implementovali metodu Dispose() . To vám umožní ukončit připojení k databázi, popisovače souborů verze nebo podobné operace při použití jiných prostředků. Pokud nejsou k dispozici žádné další prostředky, zadejte prázdnou Dispose() implementaci.
Vlastnosti
Current |
Získá prvek v kolekci na aktuální pozici enumerátoru. |
Metody
Dispose() |
Provede aplikací definované úlohy spojené s uvolněním nebo resetováním nespravovaných prostředků. (Zděděno od IDisposable) |
MoveNext() |
Posune enumerátor na další prvek kolekce. (Zděděno od IEnumerator) |
Reset() |
Nastaví enumerátor na počáteční pozici, která je před prvním prvkem v kolekci. (Zděděno od IEnumerator) |
Platí pro
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro