Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Metodo IEnumerable.GetEnumerator

Restituisce un enumeratore che consente di scorrere una raccolta.

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

IEnumerator GetEnumerator()

Valore restituito

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

L'istruzione foreach del linguaggio C# (For Each in Visual Basic) consente di nascondere la complessità degli enumeratori. Pertanto, si consiglia di utilizzare foreach, piuttosto che modificare direttamente l'enumeratore.

È possibile utilizzare enumeratori per leggere i dati nella raccolta, ma non per modificare la raccolta sottostante.

Inizialmente, l'enumeratore è posizionato prima del primo elemento della raccolta. Il metodo Reset riporta inoltre l'enumeratore in questa posizione. In questa posizione la proprietà Current non è definita. È pertanto necessario chiamare il metodo MoveNext per spostare in avanti l'enumeratore in corrispondenza del primo elemento della raccolta prima di leggere il valore di Current.

Current restituisce lo stesso oggetto fino alla chiamata di MoveNext o Reset. MoveNext imposta Current sull'elemento successivo.

Se MoveNext supera la fine della raccolta, l'enumeratore viene posizionato dopo l'ultimo elemento della raccolta e MoveNext restituisce false. Quando l'enumeratore si trova in questa posizione, anche le successive chiamate a MoveNext restituiscono false. Se l'ultima chiamata al metodo MoveNext restituisce false, la proprietà Current è indefinita. Per impostare nuovamente Current sul primo elemento della raccolta, è possibile chiamare Reset, quindi MoveNext.

Un enumeratore rimane valido fino a quando la raccolta rimane invariata. Se vengono apportate modifiche alla raccolta, ad esempio l'aggiunta, la modifica o l'eliminazione di elementi, l'enumeratore verrà irrimediabilmente invalidato e il relativo comportamento sarà non definito.

L'enumeratore non dispone di accesso esclusivo alla raccolta, pertanto il processo di enumerazione di 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 l'accesso alla raccolta in lettura e scrittura da parte di più thread, è necessario implementare una sincronizzazione personalizzata.

Nell'esempio di codice riportato di seguito viene illustrata l'implementazione delle interfacce IEnumerable di un insieme personalizzato. In questo esempio, il metodo GetEnumerator non è chiamato in modo esplicito, 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 fornito per l'interfaccia IEnumerable.


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.2, 4.5.1, 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

.NET per applicazioni Windows Phone

Supportato in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, 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.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft