ReadOnlyCollectionBase.GetEnumerator メソッド
ReadOnlyCollectionBase インスタンスを反復処理できる列挙子を返します。
Public Overridable Function GetEnumerator() As IEnumerator _ Implements IEnumerable.GetEnumerator
[C#]
public virtual IEnumerator GetEnumerator();
[C++]
public: virtual IEnumerator* GetEnumerator();
[JScript]
public function GetEnumerator() : IEnumerator;
戻り値
ReadOnlyCollectionBase インスタンスの IEnumerator 。
実装
解説
列挙子は、コレクション内のデータを読み取るためだけに使用できます列挙子を使用して基になるコレクションを変更することはできません。
初期状態では、列挙子はコレクションの最初の要素の前に位置しています。 Reset を実行した場合も、列挙子はこの位置に戻されます。この位置で Current を呼び出すと、例外がスローされます。したがって、 Current の値を読み取る前に、 MoveNext を呼び出して、コレクションの最初の要素に列挙子を進める必要があります。
Current は、 MoveNext または Reset が呼び出されるまでは同じオブジェクトを返します。 MoveNext は、 Current を次の要素に位置付けます。
コレクションの末尾を過ぎると列挙子はコレクションの最後の要素の後に位置付けられ、 MoveNext を呼び出すと false が返されます。 MoveNext への最後の呼び出しで false が返された場合は、 Current を呼び出すと例外がスローされます。 Current をコレクションの最初の要素に再度位置付けるには、 Reset を呼び出し、次に MoveNext を呼び出します。
列挙子は、コレクションが変更されない限り有効です。要素の追加、変更、削除などの変更がコレクションに対して実行されると、列挙子は回復不可能な無効状態になり、次に MoveNext または Reset を呼び出すと、 InvalidOperationException がスローされます。コレクションが MoveNext と Current の間で変更された場合、列挙子が既に無効になっていても、 Current は設定した要素を返します。
列挙子はコレクションへの排他アクセス権を持たないため、コレクションの列挙処理は、本質的にはスレッド セーフな処理ではありません。コレクションが同期されている場合でも、他のスレッドがそのコレクションを変更する可能性はあり、そのような状況が発生すると列挙子は例外をスローします。列挙処理を確実にスレッド セーフに行うには、列挙中にコレクションをロックするか、他のスレッドによって行われた変更によってスローされる例外をキャッチする方法のいずれかを実行できます。
使用例
[Visual Basic, C#, C++] ReadOnlyCollectionBase クラスを実装するコード例を次に示します。
Imports System
Imports System.Collections
Public Class ROCollection
Inherits ReadOnlyCollectionBase
Public Sub New(sourceList As IList)
InnerList.AddRange(sourceList)
End Sub 'New
Default Public ReadOnly Property Item(index As Integer) As [Object]
Get
Return InnerList(index)
End Get
End Property
Public Function IndexOf(value As [Object]) As Integer
Return InnerList.IndexOf(value)
End Function 'IndexOf
Public Function Contains(value As [Object]) As Boolean
Return InnerList.Contains(value)
End Function 'Contains
End Class 'ROCollection
Public Class SamplesCollectionBase
Public Shared Sub Main()
' Create an ArrayList.
Dim myAL As New ArrayList()
myAL.Add("red")
myAL.Add("blue")
myAL.Add("yellow")
myAL.Add("green")
myAL.Add("orange")
myAL.Add("purple")
' Create a new ROCollection that contains the elements in myAL.
Dim myCol As New ROCollection(myAL)
' Display the contents of the collection using the enumerator.
Console.WriteLine("Contents of the collection (using enumerator):")
PrintIndexAndValues(myCol)
' Search the collection with Contains and IndexOf.
Console.WriteLine("Contains yellow: {0}", myCol.Contains("yellow"))
Console.WriteLine("orange is at index {0}.", myCol.IndexOf("orange"))
Console.WriteLine()
' Display the contents of the collection using the Count property and the Item property.
Console.WriteLine("Contents of the collection (using Count and Item):")
PrintIndexAndValues2(myCol)
End Sub 'Main
Public Shared Sub PrintIndexAndValues(myCol As ROCollection)
Dim i As Integer = 0
Dim myEnumerator As System.Collections.IEnumerator = myCol.GetEnumerator()
While myEnumerator.MoveNext()
Console.WriteLine(" [{0}]: {1}", i, myEnumerator.Current)
i += 1
End While
Console.WriteLine()
End Sub 'PrintIndexAndValues
Public Shared Sub PrintIndexAndValues2(myCol As ROCollection)
Dim i As Integer
For i = 0 To myCol.Count - 1
Console.WriteLine(" [{0}]: {1}", i, myCol(i))
Next i
Console.WriteLine()
End Sub 'PrintIndexAndValues2
End Class 'SamplesCollectionBase
'This code produces the following output.
'
'Contents of the collection (using enumerator):
' [0]: red
' [1]: blue
' [2]: yellow
' [3]: green
' [4]: orange
' [5]: purple
'
'Contains yellow: True
'orange is at index 4.
'
'Contents of the collection (using Count and Item):
' [0]: red
' [1]: blue
' [2]: yellow
' [3]: green
' [4]: orange
' [5]: purple
[C#]
using System;
using System.Collections;
public class ROCollection : ReadOnlyCollectionBase {
public ROCollection( IList sourceList ) {
InnerList.AddRange( sourceList );
}
public Object this[ int index ] {
get {
return( InnerList[index] );
}
}
public int IndexOf( Object value ) {
return( InnerList.IndexOf( value ) );
}
public bool Contains( Object value ) {
return( InnerList.Contains( value ) );
}
}
public class SamplesCollectionBase {
public static void Main() {
// Create an ArrayList.
ArrayList myAL = new ArrayList();
myAL.Add( "red" );
myAL.Add( "blue" );
myAL.Add( "yellow" );
myAL.Add( "green" );
myAL.Add( "orange" );
myAL.Add( "purple" );
// Create a new ROCollection that contains the elements in myAL.
ROCollection myCol = new ROCollection( myAL );
// Display the contents of the collection using the enumerator.
Console.WriteLine( "Contents of the collection (using enumerator):" );
PrintIndexAndValues( myCol );
// Search the collection with Contains and IndexOf.
Console.WriteLine( "Contains yellow: {0}", myCol.Contains( "yellow" ) );
Console.WriteLine( "orange is at index {0}.", myCol.IndexOf( "orange" ) );
Console.WriteLine();
// Display the contents of the collection using the Count property and the Item property.
Console.WriteLine( "Contents of the collection (using Count and Item):" );
PrintIndexAndValues2( myCol );
}
public static void PrintIndexAndValues( ROCollection myCol ) {
int i = 0;
System.Collections.IEnumerator myEnumerator = myCol.GetEnumerator();
while ( myEnumerator.MoveNext() )
Console.WriteLine( " [{0}]: {1}", i++, myEnumerator.Current );
Console.WriteLine();
}
public static void PrintIndexAndValues2( ROCollection myCol ) {
for ( int i = 0; i < myCol.Count; i++ )
Console.WriteLine( " [{0}]: {1}", i, myCol[i] );
Console.WriteLine();
}
}
/*
This code produces the following output.
Contents of the collection (using enumerator):
[0]: red
[1]: blue
[2]: yellow
[3]: green
[4]: orange
[5]: purple
Contains yellow: True
orange is at index 4.
Contents of the collection (using Count and Item):
[0]: red
[1]: blue
[2]: yellow
[3]: green
[4]: orange
[5]: purple
*/
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Collections;
public __gc class ROCollection : public ReadOnlyCollectionBase {
public:
ROCollection( IList* sourceList ) {
InnerList->AddRange( sourceList );
}
public:
__property Object* get_Item( int index ) {
return( InnerList->Item[index] );
}
public:
int IndexOf( Object* value ) {
return( InnerList->IndexOf( value ) );
}
public:
bool Contains( Object* value ) {
return( InnerList->Contains( value ) );
}
};
static void PrintIndexAndValues( ROCollection* myCol ) {
int i = 0;
System::Collections::IEnumerator* myEnumerator = myCol->GetEnumerator();
while ( myEnumerator->MoveNext() )
Console::WriteLine( S" [{0}]: {1}", __box(i++), myEnumerator->Current );
Console::WriteLine();
}
static void PrintIndexAndValues2( ROCollection* myCol ) {
for ( int i = 0; i < myCol->Count; i++ )
Console::WriteLine( S" [{0}]: {1}", __box(i), myCol->Item[i] );
Console::WriteLine();
}
int main() {
// Create an ArrayList.
ArrayList* myAL = new ArrayList();
myAL->Add( S"red" );
myAL->Add( S"blue" );
myAL->Add( S"yellow" );
myAL->Add( S"green" );
myAL->Add( S"orange" );
myAL->Add( S"purple" );
// Create a new ROCollection that contains the elements in myAL.
ROCollection* myCol = new ROCollection( myAL );
// Display the contents of the collection using the enumerator.
Console::WriteLine( S"Contents of the collection (using enumerator):" );
PrintIndexAndValues( myCol );
// Search the collection with Contains and IndexOf.
Console::WriteLine( S"Contains yellow: {0}", __box(myCol->Contains( S"yellow" )));
Console::WriteLine( S"orange is at index {0}.", __box(myCol->IndexOf( S"orange" )));
Console::WriteLine();
// Display the contents of the collection using the Count property and the Item property.
Console::WriteLine( S"Contents of the collection (using Count and Item):" );
PrintIndexAndValues2( myCol );
}
/*
This code produces the following output.
Contents of the collection (using enumerator):
[0]: red
[1]: blue
[2]: yellow
[3]: green
[4]: orange
[5]: purple
Contains yellow: True
orange is at index 4.
Contents of the collection (using Count and Item):
[0]: red
[1]: blue
[2]: yellow
[3]: green
[4]: orange
[5]: purple
*/
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
参照
ReadOnlyCollectionBase クラス | ReadOnlyCollectionBase メンバ | System.Collections 名前空間 | System.Collections.IEnumerator