Leggi in inglese

Condividi tramite


IEnumerable Interfaccia

Definizione

Espone un enumeratore, che supporta una semplice iterazione su una raccolta non generica.

C#
public interface IEnumerable
C#
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
C#
[System.Runtime.InteropServices.Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IEnumerable
Derivato
Attributi

Esempio

Nell'esempio di codice seguente viene illustrata la procedura consigliata per l'iterazione di una raccolta personalizzata implementando le interfacce IEnumerable e IEnumerator. In questo esempio i membri di queste interfacce non vengono chiamati in modo esplicito, ma vengono implementati per supportare l'uso di foreach (For Each in Visual Basic) per scorrere la raccolta. Questo esempio è un'app console completa. Per compilare l'app Visual Basic, modificare il dell'oggetto di avvio in Sub Main nella pagina Proprietà del progetto.

C#
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
 *
 */

Commenti

IEnumerable è l'interfaccia di base per tutte le raccolte non generiche che possono essere enumerate. Per la versione generica di questa interfaccia, vedere System.Collections.Generic.IEnumerable<T>. IEnumerable contiene un singolo metodo, GetEnumerator, che restituisce un IEnumerator. IEnumerator consente di scorrere la raccolta esponendo una proprietà Current e MoveNext e metodi Reset.

È consigliabile implementare IEnumerable e IEnumerator nelle classi di raccolta per abilitare la sintassi foreach (For Each in Visual Basic), ma l'implementazione di IEnumerable non è necessaria. Se la raccolta non implementa IEnumerable, è comunque necessario seguire il modello iteratore per supportare questa sintassi fornendo un metodo GetEnumerator che restituisce un'interfaccia, una classe o uno struct. Quando si usa Visual Basic, è necessario fornire un'implementazione IEnumerator, restituita da GetEnumerator. Quando si sviluppa con C# è necessario fornire una classe contenente una proprietà Current e metodi MoveNext e Reset come descritto da IEnumerator, ma la classe non deve implementare IEnumerator.

Metodi

GetEnumerator()

Restituisce un enumeratore che scorre un insieme.

Metodi di estensione

Cast<TResult>(IEnumerable)

Esegue il cast degli elementi di un IEnumerable al tipo specificato.

OfType<TResult>(IEnumerable)

Filtra gli elementi di un IEnumerable in base a un tipo specificato.

AsParallel(IEnumerable)

Abilita la parallelizzazione di una query.

AsQueryable(IEnumerable)

Converte un IEnumerable in un IQueryable.

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Vedi anche