IEnumerator<T> Interface
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Suporta uma iteração simples sobre uma coleção genérica.
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
Parâmetros de Tipo Genérico
- T
O tipo de objetos a enumerar.
Este parâmetro de tipo é covariante. Ou seja, pode utilizar o tipo que especificou ou qualquer tipo que seja mais derivado. Para obter mais informações sobre covariância e contravariância, veja Covariância e Contravariância em Genérico.- Derivado
- Implementações
Exemplos
O exemplo seguinte mostra uma implementação da IEnumerator<T> interface para uma classe de coleção de objetos personalizados. O objeto personalizado é uma instância do tipo Box, e a classe de coleção é BoxCollection. Este exemplo de código faz parte de um exemplo maior fornecido para a ICollection<T> interface.
// 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
Observações
IEnumerator<T> é a interface base para todos os enumeradores genéricos.
A instrução foreach da linguagem C# (For Each em Visual Basic) esconde a complexidade dos enumeradores. Por isso, recomenda-se o uso foreach , em vez de manipular diretamente o enumerador.
Os enumeradores podem ser usados para ler os dados da coleção, mas não podem ser usados para modificar a coleção subjacente.
Inicialmente, o enumerador é posicionado antes do primeiro elemento da coleção. Nesta posição, Current é indefinido. Portanto, deve chamar MoveNext para avançar o enumerador até ao primeiro elemento da coleção antes de ler o valor de Current.
Current devolve o mesmo objeto até MoveNext ser chamado. MoveNext passa Current para o elemento seguinte.
Se MoveNext passar o final da coleção, o enumerador é posicionado após o último elemento da coleção e MoveNext retorna false. Quando o enumerador está nesta posição, chamadas subsequentes também MoveNext retornam false. Se a última chamada devolvida MoveNextfalse, Current for indefinida. Não pode voltar a definir Current para o primeiro elemento da coleção; deve criar uma nova instância de enumerador em vez disso.
O Reset método é fornecido para interoperabilidade COM. Não precisa necessariamente de ser implementado; em vez disso, o implementador pode simplesmente lançar um NotSupportedException. No entanto, se optar por isso, deve garantir que nenhum chamador depende da Reset funcionalidade.
Se forem feitas alterações à coleção, como adicionar, modificar ou eliminar elementos, o comportamento do enumerador permanece indefinido.
O enumerador não tem acesso exclusivo à coleção; Portanto, enumerar através de uma coleção não é intrinsecamente um procedimento seguro para threads. Para garantir a segurança da linha durante a enumeração, pode bloquear a coleção durante toda a enumeração. Para permitir que a coleção seja acedida por múltiplos threads para leitura e escrita, deve implementar a sua própria sincronização.
As implementações padrão das coleções no System.Collections.Generic namespace não estão sincronizadas.
Notas para Implementadores
Implementar esta interface requer implementar a interface não genérica IEnumerator . Os MoveNext() métodos e Reset() não dependem de T, e aparecem apenas na interface não genérica. A Current propriedade aparece em ambas as interfaces e tem diferentes tipos de retorno. Implemente a propriedade não genérica Current como uma implementação explícita de interface. Isto permite que qualquer consumidor da interface não genérica consuma a interface genérica.
Além disso, IEnumerator<T> implementa IDisposable, que exige que implemente o Dispose() método. Isto permite-lhe fechar ligações à base de dados ou libertar handles de ficheiros ou operações semelhantes ao usar outros recursos. Se não houver recursos adicionais para eliminar, forneça uma implementação vazia Dispose() .
Propriedades
| Name | Description |
|---|---|
| Current |
Obtém o elemento na coleção na posição atual do enumerador. |
Métodos
| Name | Description |
|---|---|
| Dispose() |
Realiza tarefas definidas pela aplicação associadas à libertação, libertação ou reinício de recursos não geridos. (Herdado de IDisposable) |
| MoveNext() |
Avança o enumerador para o próximo elemento da coleção. (Herdado de IEnumerator) |
| Reset() |
Define o enumerador para a sua posição inicial, que é antes do primeiro elemento da coleção. (Herdado de IEnumerator) |