Pregunta

Tengo este código

public class SomeClass<T>: IEnumerable<T>
{
    public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

¿Cómo puedo extraer un IEnumerator de MyList?

Gracias StackoverFlower ...

¿Fue útil?

Solución

Esto:

public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

Necesita ser esto:

public List<T> MyList = new List<T>();

entonces, esto debería funcionar:

public IEnumerator<T> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

No puedes tener un

List<SomeClass<T>>

para el que extrajo el enumerador, porque ha especificado en la interfaz que el enumerador devolverá un elemento enumerable de < T > . También puede cambiar IEnumerable < T > para que sea

IEnumerable<SomeClass<T>>

y cambia el enumerador para que sea

public IEnumerator<SomeClass<T>> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

Otros consejos

La opción trivial sería return MyList.GetEnumerator () .

La respuesta de Kevin es correcta y es perezosa (incluso mejor). Si usa la respuesta de Trodek, se lanzará la siguiente excepción:

Cannot implicitly convert type `System.Collections.Generic.List<SomeClass<T>>.Enumerator' to `System.Collections.Generic.IEnumerator<T>'(CS0029)

Sin embargo quiero añadir un comentario. Cuando utiliza rendimiento rendimiento , se genera una máquina de estado que devolverá los diferentes valores. Si va a utilizar estructuras de datos anidadas (por ejemplo, árboles), el rendimiento de rendimiento asignará mucha más memoria porque se creará una máquina de estado diferente en cada subestructura.

Bueno, ¡esos son mis dos centavos!

Suponiendo que hay una manera de obtener un objeto T de un objeto SomeClass,

public IEnumerator<T> GetEnumerator()
{
    return MyList.Select(ml => ml.GetT() /* operation to get T */).GetEnumerator();
}

Como complemento a la respuesta aceptada, si recibió el mensaje

MyNamespace.MyClass<T>' does not implement interface
  member 'System.Collections.IEnumerable.GetEnumerator()'.
  'WindowsFormsApplication1.SomeClass<T>.GetEnumerator()' cannot implement
  'System.Collections.IEnumerable.GetEnumerator()' because it does not have
  the matching return type of 'System.Collections.IEnumerator'.

Debe implementar el método adicional GetEnumerator () :

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

IEnumerable < T > implementa IEnumerable por lo que deben implementarse ambas formas de GetEnumerator () .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top