IEnumerator<T> Arabirim
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Genel bir koleksiyon üzerinde basit bir yinelemeyi destekler.
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
Tür Parametreleri
- T
Numaralandıracak nesnelerin türü.
Bu genel tür parametresi kovaryanttır. Bu, kendi belirttiğiniz türü veya daha fazla türetilmiş başka bir türü kullanabileceğiniz anlamına gelir. Kovaryans ve kontravaryans hakkında daha fazla bilgi için bkz. Genel Türlerde Kovaryans ve Kontravaryans.- Türetilmiş
- Uygulamalar
Örnekler
Aşağıdaki örnekte, özel nesnelerin koleksiyon sınıfı için arabiriminin bir uygulaması IEnumerator<T> gösterilmektedir. Özel nesne türünün Box
bir örneğidir ve koleksiyon sınıfı ise şeklindedir BoxCollection
. Bu kod örneği, arabirim için ICollection<T> sağlanan daha büyük bir örneğin parçasıdır.
// 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
Açıklamalar
IEnumerator<T> tüm genel numaralandırıcılar için temel arabirimdir.
foreach
C# dilinin deyimi (for each
Visual Basic'te C++For Each
'da) numaralandırıcıların karmaşıklığını gizler. Bu nedenle, numaralandırıcıyı doğrudan işlemek yerine kullanılması foreach
önerilir.
Numaralandırıcılar, koleksiyonundaki verileri okumak için kullanılabilir, ancak temel koleksiyonu değiştirmek için kullanılamaz.
Başlangıçta, numaralandırıcı, koleksiyondaki ilk öğenin önüne yerleştirilir. Bu konumda Current tanımlanmamıştır. Bu nedenle, değerini Currentokumadan önce numaralandırıcıyı koleksiyonun ilk öğesine ilerletmek için çağrısında MoveNext bulunmalısınız.
Current çağrılana kadar MoveNext aynı nesneyi döndürür. MoveNext bir sonraki öğeye ayarlar Current .
Koleksiyonun sonunu geçerse MoveNext , numaralandırıcı koleksiyondaki son öğeden sonra konumlandırılır ve MoveNext döndürür false
. Numaralandırıcı bu konumda olduğunda, sonraki çağrıları MoveNext da döndürür false
. döndürülen son çağrı MoveNextfalse
Current tanımlanmamışsa. Koleksiyonun ilk öğesine yeniden ayarlayamazsınız Current ; bunun yerine yeni bir numaralandırıcı örneği oluşturmanız gerekir.
Reset yöntemi COM birlikte çalışabilirliği için sağlanır. Uygulanması gerekmez; bunun yerine uygulayıcı bir oluşturabilir NotSupportedException. Ancak, bunu yapmayı seçerseniz, çağıranın Reset işlevlere güvenmediğinden emin olmanız gerekir.
Koleksiyonda öğe ekleme, değiştirme veya silme gibi değişiklikler yapılırsa, numaralandırıcının davranışı tanımsızdır.
Numaralandırıcının, koleksiyona özel kullanım erişimi yok; bu nedenle, bir koleksiyon içinde numaralandırma aslında bir iş parçacığı açısından güvenli yordam değildir. Numaralandırma sırasında iş parçacığı güvenliği sağlamak için tüm numaralandırma sırasında koleksiyonu kilitleyebilirsiniz. Okuma ve yazma için birden çok iş parçacığı tarafından erişilecek koleksiyona izin vermek için kendi eşitlemenizi uygulamalısınız.
Ad alanında System.Collections.Generic koleksiyonların varsayılan uygulamaları eşitlenmez.
Uygulayanlara Notlar
Bu arabirimin uygulanması içingenerik IEnumerator olmayan arabirimin uygulanması gerekir.
MoveNext() ve Reset() yöntemleri öğesine bağımlı T
değildir ve yalnızcagenerik olmayan arabirimde görünür.
Current özelliği her iki arabirimde de görünür ve farklı dönüş türlerine sahiptir. Nongeneric Current özelliğini açık bir arabirim uygulaması olarak uygulayın. Bu, genel olmayan arabirimin tüm tüketicilerinin genel arabirimi kullanmasına olanak tanır.
Buna ek olarak, IEnumerator<T>IDisposableyöntemini uygulamanızı Dispose() gerektiren uygulamasını uygular. Bu, diğer kaynakları kullanırken veritabanı bağlantılarını kapatmanızı veya dosya tanıtıcılarını veya benzer işlemleri bırakmanızı sağlar. Atılacak ek kaynak yoksa boş Dispose() bir uygulama sağlayın.
Özellikler
Current |
Koleksiyondaki öğeyi numaralandırıcının geçerli konumunda alır. |
Yöntemler
Dispose() |
Uygulama tarafından tanımlanan, yönetilmeyen kaynakları serbest bırakma, salma veya sıfırlama ile ilişkili görevleri gerçekleştirir. (Devralındığı yer: IDisposable) |
MoveNext() |
Numaralandırıcıyı koleksiyonun sonraki öğesine ilerler. (Devralındığı yer: IEnumerator) |
Reset() |
Numaralandırıcıyı koleksiyondaki ilk öğeden önceki başlangıç konumuna ayarlar. (Devralındığı yer: IEnumerator) |
Şunlara uygulanır
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin