다음을 통해 공유


IEnumerable 인터페이스

정의

제네릭이 아닌 컬렉션에 대한 간단한 반복을 지원하는 열거자를 노출합니다.

public interface class IEnumerable
public interface IEnumerable
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IEnumerable
type IEnumerable = interface
[<System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")>]
type IEnumerable = interface
[<System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type IEnumerable = interface
Public Interface IEnumerable
파생
특성

예제

다음 코드 예제에서는 IEnumerableIEnumerator 인터페이스를 구현하여 사용자 지정 컬렉션을 반복하는 모범 사례를 보여 줍니다. 이 예제에서 이러한 인터페이스의 멤버는 명시적으로 호출되지 않지만 컬렉션을 반복하기 위해 foreach(Visual Basic의For Each)를 사용하도록 지원하도록 구현됩니다. 이 예제는 전체 콘솔 앱입니다. Visual Basic 앱을 컴파일하려면 프로젝트의 속성 페이지에서 시작 개체Sub Main 변경합니다.

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

설명

IEnumerable 열거할 수 있는 제네릭이 아닌 모든 컬렉션의 기본 인터페이스입니다. 이 인터페이스의 제네릭 버전은 System.Collections.Generic.IEnumerable<T>참조하세요. IEnumerable IEnumerator반환하는 단일 메서드 GetEnumerator포함합니다. IEnumerator Current 속성과 MoveNextReset 메서드를 노출하여 컬렉션을 반복하는 기능을 제공합니다.

컬렉션 클래스에서 IEnumerableIEnumerator 구현하여 foreach(Visual Basic의For Each) 구문을 사용하도록 설정하는 것이 가장 좋지만 IEnumerable 구현할 필요는 없습니다. 컬렉션이 IEnumerable구현하지 않는 경우에도 반복기 패턴을 따라 인터페이스, 클래스 또는 구조체를 반환하는 GetEnumerator 메서드를 제공하여 이 구문을 지원해야 합니다. Visual Basic을 사용하는 경우 GetEnumerator반환되는 IEnumerator 구현을 제공해야 합니다. C#을 사용하여 개발할 때는 IEnumerator설명한 대로 Current 속성과 MoveNextReset 메서드를 포함하는 클래스를 제공해야 하지만 클래스는 IEnumerator구현할 필요가 없습니다.

메서드

GetEnumerator()

컬렉션을 반복하는 열거자를 반환합니다.

확장 메서드

Cast<TResult>(IEnumerable)

IEnumerable 요소를 지정된 형식으로 캐스팅합니다.

OfType<TResult>(IEnumerable)

지정된 형식에 따라 IEnumerable 요소를 필터링합니다.

AsParallel(IEnumerable)

쿼리의 병렬 처리를 사용하도록 설정합니다.

AsQueryable(IEnumerable)

IEnumerable IQueryable변환합니다.

적용 대상

추가 정보