IEnumeratorとは? わかりやすく解説

IEnumerator インターフェイス

ジェネリック コレクション対す単純な反復処理サポートします

名前空間: System.Collections
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

<ComVisibleAttribute(True)> _
<GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")>
 _
Public Interface IEnumerator
[ComVisibleAttribute(true)] 
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")] 
public interface IEnumerator
[ComVisibleAttribute(true)] 
[GuidAttribute(L"496B0ABF-CDEE-11d3-88E8-00902754C43A")] 
public interface class IEnumerator
/** @attribute ComVisibleAttribute(true) */ 
/** @attribute GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A") */
 
public interface IEnumerator
ComVisibleAttribute(true) 
GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A") 
public interface IEnumerator
解説解説

IEnumerator は、すべてのジェネリック列挙子に対す基本インターフェイスです。

このインターフェイスジェネリック バージョンについては、「IEnumerator」を参照してください

C# 言語foreach ステートメント (Visual Basic の場合for each) を使用することで列挙子の複雑さ回避できます。したがって列挙子を直接操作するではなくforeach使用お勧めます。

列挙子を使用すると、コレクション内のデータ読み取ることができますが、基になるコレクション変更することはできません。

最初に列挙子はコレクション最初要素前に配置されます。また、Reset メソッドは、列挙子を最初位置戻しますこの位置で Current プロパティ呼び出すと、例外スローさます。たがってCurrent の値を読み取る前に、MoveNext メソッド呼び出してコレクション最初要素列挙子を進める必要があります

Current は、MoveNext または Reset呼び出されるまでは同じオブジェクト返しますMoveNext は、Current次の要素設定します

MoveNextコレクション末尾を過ぎると、列挙子はコレクション最後要素後ろ配置されMoveNextfalse返します列挙子がこの位置にある場合以降MoveNext呼び出してfalse返されます。MoveNext への最後呼び出しfalse返され場合に、Current呼び出すと例外スローさます。Currentコレクション最初要素に再び設定するには、Reset呼び出してから、MoveNext呼び出します。

コレクション変更されない限り列挙子は有効なままです。要素追加変更削除などの変更コレクションに対して実行されると、列挙子は回復不可能な無効状態になり、次に MoveNext または Reset呼び出すと InvalidOperationException がスローさます。MoveNextCurrent の間でコレクション変更すると、列挙子が無効になっている場合でも、Current設定先の要素返します

列挙子はコレクションへの排他アクセス権持たないため、コレクション列挙処理は、本質的にスレッド セーフな処理ではありません。コレクション同期されている場合でも、他のスレッドがそのコレクション変更する可能性はあり、そのような状況発生すると列挙子例外スローます。列挙処理を確実にスレッド セーフに行うには、列挙中にコレクションロックするか、他のスレッドによって行われた変更によってスローされる例外キャッチします。

使用例使用例

カスタム コレクションでの IEnumerable インターフェイスIEnumerator インターフェイス実装次のコード例示します。この例では、これらのインターフェイスメンバ明示的に呼び出されていませんが、foreach (Visual Basic では for each) の使用によるコレクション反復処理サポートするために実装されています。

Imports System
Imports System.Collections

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

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

    Public Function GetEnumerator() As
 IEnumerator _
      Implements IEnumerable.GetEnumerator

        Return New PeopleEnum(_people)
    End Function

End Class

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

using System;
using System.Collections;

public class Person
{
    public Person(string fName, string
 lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public string firstName;
    public string lastName;
}

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];
        }
    }

    public IEnumerator GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
}

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;
    }

    public object 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
 * 
 */
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
IEnumerator メンバ
System.Collections 名前空間
IEnumerable インターフェイス
ICollection インターフェイス
System.Collections.Generic.IEnumerator

IEnumerator ジェネリック インターフェイス

メモ : このインターフェイスは、.NET Framework version 2.0新しく追加されたものです。

ジェネリック コレクション対す単純な反復処理サポートします

名前空間: System.Collections.Generic
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

Public Interface IEnumerator(Of
 T)
    Inherits IDisposable, IEnumerator
Dim instance As IEnumerator(Of
 T)
public interface IEnumerator<T> : IDisposable, IEnumerator
generic<typename T>
public interface class IEnumerator : IDisposable,
 IEnumerator
J# では、ジェネリックな型およびメソッド使用できますが、新規に宣言することはできません。
JScript では、ジェネリックな型およびメソッド使用できません。

型パラメータ

T

列挙するオブジェクトの型。

解説解説

IEnumerator は、すべてのジェネリック列挙子に対す基本インターフェイスです。

C# 言語foreach ステートメント (C++ の場合for eachVisual Basic の場合For Each) を使用することで列挙子の複雑さ回避できます。したがって列挙子を直接操作するではなくforeach使用お勧めます。

列挙子を使用すると、コレクション内のデータ読み取ることができますが、基になるコレクション変更することはできません。

最初に列挙子はコレクション最初要素前に配置されます。この位置で、Current未定義です。したがってCurrent の値を読み取る前に、MoveNext を呼び出してコレクション最初要素列挙子を進める必要があります

Current は、MoveNext呼び出されるまでは同じオブジェクト返しますMoveNext は、Current次の要素設定します

MoveNextコレクション末尾を過ぎると、列挙子はコレクション最後要素後ろ配置されMoveNextfalse返します列挙子がこの位置にある場合以降MoveNext呼び出してfalse返されます。MoveNext への最後呼び出しfalse返され場合は、Current未定義です。Current を、再度コレクション最初要素設定することはできません。列挙子の新しインスタンス作成する必要があります

コレクション変更されない限り列挙子は有効なままです。要素追加変更削除などの変更コレクションに対して実行されると、列挙子は回復不可能な無効状態になり、動作未定義になります

列挙子には、コレクションへの排他的なアクセスがありません。したがってコレクション列挙処理は、本質的にスレッド セーフな処理ではありません。すべての列挙処理が終わるまでコレクションロックすることにより、列挙処理でのスレッド セーフ確保できますコレクション対し複数スレッドアクセスして読み取り書き込みを行うことができるようにするには、独自に同期化実装する必要があります

System.Collections.Generic 名前空間コレクション既定実装同期されません。

実装時の注意 このインターフェイス実装するには、非ジェネリックの IEnumerator インターフェイス実装する必要がありますMoveNext メソッドReset メソッドは、T依存せず、非ジェネリック インターフェイスにのみ含まれています。Current プロパティは、両方インターフェイス含まれていますが、戻り値の型が異なります。非ジェネリックの IEnumerator.Current プロパティ明示的なインターフェイスの実装として実装ます。これにより、非ジェネリック インターフェイスコンシューマジェネリック インターフェイス使用できます

プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照

IEnumerator プロパティ


IEnumerator プロパティ


IEnumerator メソッド


IEnumerator メンバ


IEnumerator メンバ




英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「IEnumerator」の関連用語

IEnumeratorのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



IEnumeratorのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2024 Microsoft.All rights reserved.

©2024 GRAS Group, Inc.RSS