Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale
Questo argomento non è stato ancora valutato - Valuta questo argomento

Metodo IEnumerable.GetEnumerator

Restituisce un enumeratore che scorre una raccolta.

Spazio dei nomi:  System.Collections
Assembly:  mscorlib (in mscorlib.dll)
IEnumerator GetEnumerator()

Valore restituito

Tipo: System.Collections.IEnumerator
IEnumerator oggetto che può essere utilizzato per scorrere la raccolta.

foreach l'istruzione del linguaggio c# (For Each in Visual Basic) nasconde la complessità degli enumeratori. Pertanto, tramite foreach si consiglia, anziché direttamente la modifica dell'enumeratore.

Gli enumeratori possono essere utilizzati per leggere i dati nella raccolta, ma non possono essere utilizzati per modificare la raccolta sottostante.

Inizialmente, l'enumeratore verrà inserito prima del primo elemento nella raccolta. Reset il metodo inoltre l'enumeratore in questa posizione. In questa posizione, Current la proprietà è definita. Pertanto, è necessario chiamare MoveNext metodo corrispondenza del primo elemento della raccolta prima di leggere il valore di Current.

Current restituisce lo stesso oggetto fino peruna o l'altra MoveNext o Reset viene chiamato. MoveNext set Current all'elemento successivo.

se MoveNext passa la fine della raccolta, l'enumeratore verrà posizionato dopo l'ultimo elemento della raccolta e MoveNext restituisce false. Quando l'enumeratore si trova in questa posizione, chiamate successive a MoveNext anche restituiscono false. se l'ultima chiamata a MoveNext restituisce false, Current è definito. Impostare Current il primo elemento della raccolta inoltre, è possibile chiamare Reset seguito da MoveNext.

Un enumeratore rimane valido finché la raccolta rimane invariata. Se vengono apportate modifiche alla raccolta, ad esempio aggiungendo, modificando, o l'eliminazione di elementi, l'enumeratore verrà irrimediabilmente invalidato e il relativo comportamento è definito.

L'enumeratore non ha accesso esclusivo alla raccolta; pertanto, enumerare una raccolta non è di per sé thread-safe. Per garantire che l'enumerazione sia thread-safe, è possibile bloccare la raccolta durante l'intera enumerazione. Per consentire la raccolta da parte di più thread per la lettura e la scrittura, è necessario implementare diventi proprietaria della sincronizzazione.

Nell'esempio di codice viene illustrata l'implementazione di IEnumerable interfacce per una raccolta personalizzata. in questo esempio, GetEnumerator in modo esplicito non viene chiamato, ma viene implementato per supportare l'utilizzo di foreach (For Each in Visual Basic). Questo esempio di codice fa parte di un esempio più esaustivo per IEnumerable interfaccia.


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

    IEnumerator IEnumerable.GetEnumerator()
    {
       return (IEnumerator) GetEnumerator();
    }

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

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


.NET Framework

Supportato in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.
Il documento è risultato utile?
(1500 caratteri rimanenti)

Aggiunte alla community

AGGIUNGI
© 2013 Microsoft. Tutti i diritti riservati.