foreach
è costruito in cima IEnumerable<T>
Il contratto per l'enumeratore sulla MSDN dice
Inizialmente, l'enumeratore è posizionato prima del primo elemento della collezione. ... Pertanto, è necessario chiamare MoveNext per far avanzare l'enumeratore sul primo elemento della raccolta prima di leggere il valore di Current.
Current restituisce lo stesso oggetto fino a quando viene chiamato MoveNext. MoveNext imposta Current sull'elemento successivo.
Quindi, se la raccolta sottostante ha chiaro elemento 'prima', e ogni elemento ha un elemento chiaro 'prossimo', come è il caso per gli array, liste e così via, allora ci si può aspettare che il foreach
comportarsi logicamente e stabilmente. Se è qualcosa come un set, che non ha una sequenza prima o successiva, allora può comportarsi in modo instabile, sebbene presumibilmente senza modificare lo stato di IEnumerable anche le collezioni che non hanno un ordine definito saranno coerenti, poiché renderle incoerenti sarebbe più lavoro!
fonte
2010-06-22 23:18:44