IEnumerator インターフェイスとは? わかりやすく解説

Weblio 辞書 > コンピュータ > .NET Framework クラス ライブラリ リファレンス > 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



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

辞書ショートカット

すべての辞書の索引

「IEnumerator インターフェイス」の関連用語

IEnumerator インターフェイスのお隣キーワード
検索ランキング

   

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



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

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

©2024 GRAS Group, Inc.RSS