unity startcoroutine run getenumerator enum ejemplo c# .net ienumerator

c# - startcoroutine - unity ienumerable



¿Cómo puedo usar IEnumerator.Reset()? (3)

¿ IEnumerator.Reset es exactamente la forma correcta de llamar a IEnumerator.Reset ?

La documentación dice:

El método Reset se proporciona para la interoperabilidad COM. No necesariamente necesita ser implementado; en cambio, el implementador puede simplemente lanzar una NotSupportedException .

Bueno, ¿eso significa que se supone que nunca debería llamarlo?

Es muy tentador usar excepciones para el control de flujo:

using (enumerator = GetSomeExpensiveEnumerator()) { while (enumerator.MoveNext()) { ... } try { enumerator.Reset(); } //Try an inexpensive method catch (NotSupportedException) { enumerator = GetSomeExpensiveEnumerator(); } //Fine, get another one while (enumerator.MoveNext()) { ... } }

¿Es así como se supone que debemos usarlo? ¿O no estamos destinados a usarlo desde el código administrado en absoluto?


Recomiendo no usarlo. Muchas implementaciones modernas de IEnumerable arrojarán una excepción.

Obtener enumeradores casi nunca es "caro". Enumerarlos a todos (completamente) puede ser costoso.


nunca ; finalmente esto fue un error. La forma correcta de iterar una secuencia más de una vez es llamar a .GetEnumerator() nuevamente, es decir, usar foreach nuevamente. Si sus datos no son repetibles (o costosos de repetir), búfer a través de .ToList() o similar.

Es un requisito formal en la especificación del lenguaje que los bloques del iterador arrojen excepciones para este método. Como tal, no puedes confiar en que funcione . Nunca.


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(); } } } }