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 インターフェイスの実装を示しています。 この例では、これらのインターフェイスのメンバーは明示的に呼び出されませんが、コレクションを反復処理するための foreach
(Visual 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> インターフェイスです。
C# 言語の foreach
ステートメント (Visual Basic のfor each
) では、列挙子の複雑さが隠されます。 そのため、列挙子を直接操作するのではなく、foreach
を使用することをお勧めします。
列挙子を使用してコレクション内のデータを読み取ることができますが、基になるコレクションを変更するために使用することはできません。
Reset メソッドは COM 相互運用性のために提供されており、完全に実装する必要はありません。代わりに、実装者は NotSupportedExceptionをスローできます。
最初は、列挙子はコレクション内の最初の要素の前に配置されます。 Currentの値を読み取る前に、MoveNext メソッドを呼び出して列挙子をコレクションの最初の要素に進める必要があります。それ以外の場合、Current は未定義です。
Current は、MoveNext または Reset が呼び出されるまで、同じオブジェクトを返します。 MoveNext Current を次の要素に設定します。
MoveNext がコレクションの末尾を渡す場合、列挙子はコレクション内の最後の要素の後に配置され、MoveNext は false
を返します。 列挙子がこの位置にある場合、後続の MoveNext の呼び出しでも false
が返されます。
MoveNext の最後の呼び出しが false
返された場合、Current は未定義です。
Current をコレクションの最初の要素に再度設定するには、実装されている場合は Resetを呼び出し、その後に MoveNextを呼び出すことができます。 Reset が実装されていない場合は、コレクションの最初の要素に戻る新しい列挙子インスタンスを作成する必要があります。
要素の追加、変更、削除など、コレクションに変更が加えられた場合、列挙子の動作は未定義になります。
列挙子は、コレクションへの排他的アクセス権を持っていません。したがって、コレクションを通じた列挙は、本質的にスレッド セーフなプロシージャではありません。 コレクションが同期されている場合でも、他のスレッドはコレクションを変更できるため、列挙子は例外をスローします。 列挙中のスレッド セーフを保証するには、列挙全体の間にコレクションをロックするか、他のスレッドによって行われた変更によって発生する例外をキャッチします。
プロパティ
Current |
列挙子の現在位置にあるコレクション内の要素を取得します。 |
メソッド
MoveNext() |
列挙子をコレクションの次の要素に進めます。 |
Reset() |
列挙子を最初の位置 (コレクション内の最初の要素の前) に設定します。 |
適用対象
こちらもご覧ください
.NET